Linq to return 如果集合包含不同的值则为 true 或 false

Linq to return true or false if a set contains distinct values

如果我 returning 的集合只包含一个不同的值,我想 return 该值(字符串)。不然我想return"Multiple".

我已将其设置为三元运算符,想知道是否可以使用 Linq 来 SQL 确定该集合是否包含一个不同的值或多个不同的值。

类似于以下内容:

Name = h.NameListings.Select(a=>a.NameId).CheckForDistinct() ? h.NameListings.Select(a=>a.NameId).First() : "Multiple"

我意识到 CheckForDistinct() 不是 Linq 方法;只是用它来解释我正在寻找的行为。

var Name=h.NameListings.Select(a=>a.NameId).Distinct().Count()==1 ?
  h.NameListings.Select(a=>a.NameId).First():
  "Multiple";

这是另一个数据库解决方案之旅,如果有多个异常则捕获异常(可能仅适用于英文版本——我不知道是否可以翻译异常消息)。

string result="";
try {
  result=h.NameListings.Select(a=>a.NameId).Distinct().Single();
}
catch(InvalidOperationException ex) {
  if (ex.Message.Contains("more than one"))
    result="Multiple";
  else
    throw;
}

我只想投入我的 2 美分,并展示一次访问数据库的解决方案示例(和 "one" 行,哈哈):

var Name = h.NameListings
  .Select(a=>a.NameId)
  .Distinct()
  .ToArray()
  .Select( (name,index) => index == 0 ? name : "Multiple" )
  .LastOrDefault();

我仍在使用三元运算符,但由于您正在寻找 Linq to SQL 解决方案,因此无法使用带有索引的 Select 扩展方法。我假设不同的数据库提供者有不同的机制来获取查询的行号。这就是为什么我们需要添加 ToArray() 才能实现查询并使用 (in-memory) Linq to Objects。

除此之外,为了解释我的回答,除了第一个条目之外的所有条目都得到 "Multiple"。如果我们真的有多个(不同的)NameId,我们可以确定最后一个条目将包含 "Multiple",否则它是 nullNameId

最后您可能会争辩说我的解决方案的可读性不如罗伯茨,我可能会同意这一点!