如果集合包含不同的值,则Linq返回true或false

时间:2016-01-15 20:46:23

标签: asp.net-mvc linq ternary-operator

如果我返回的集合只包含一个不同的值,我想返回该值(字符串)。否则,我想返回“多个”。

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

如下所示:

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

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

2 个答案:

答案 0 :(得分:2)

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;
}

答案 1 :(得分:0)

我只想投入我的2cents并展示一个解决方案的例子,一次访问数据库(和“one”行,哈哈):

.
├── Main.class
├── Main.java
├── PlaySound$1.class
├── PlaySound.class
├── PlaySound.java
└── Sounds
    └── Custom
        └── temp0x.wav

我仍在使用三元运算符,但由于您正在寻找Linq to SQL解决方案,因此无法使用带索引的Select扩展方法。我假设不同的数据库提供程序具有不同的机制来获取查询的行号。这就是为什么我们需要添加var Name = h.NameListings .Select(a=>a.NameId) .Distinct() .ToArray() .Select( (name,index) => index == 0 ? name : "Multiple" ) .LastOrDefault(); 才能实现查询并使用(内存中)Linq to Objects。

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

最后你可能会说我的解决方案不如罗伯茨那么可读,我可能同意这一点!