【问题标题】:LINQ conditional select from table and return multiple column as a single listLINQ 从表中进行条件选择并将多列作为单个列表返回
【发布时间】:2015-12-25 03:57:38
【问题描述】:

类名因某些原因而重命名。但请假设这是类结构的样子。

public class Animal{
  public List<Cat> getCatsandKitten();
  {
   ...
  }
}

public class Cat {
    public Kitten kitten;
}

public class Kitten{
  public string name;
  public string nickname; 
}

//assume this returns a list of cats and populates each Cat class with kitten values. Also ignore any syntax issues.
var animals = getCatsandKitten(); 

问题:

如何返回一个 LINQ 查询,该查询返回一个包含所有小猫的姓名或昵称的值列表或数组。 示例:给我一份名字或昵称中包含汤姆的所有小猫的列表

到目前为止,这是我的查询:

List<String> listOfKittens = animals
    .SelectMany(i => i.Cat
         .Where(m=>m.name.Contains("Tom") || m.nickname.Contains("Tom"))
         .SelectMany(s => new[] { s.name, s.nickname })
    );

这不起作用,因为我要返回两个列(名称和昵称),这意味着即使名称有一个匹配项,也会返回两个值。

提前致谢。

【问题讨论】:

  • 注意KittenCat,否则将来会是一只猫……它们都有名字、昵称和其他类似的属性。对我来说,它看起来像单个实体,应该是一个树状结构:public Cat[] Kittens { get; set; }。恕我直言。
  • 抱歉,我举了一个不好的例子。由于某些原因,我更改了类名,但假设这是现有的类结构。我将如何查询它?

标签: linq


【解决方案1】:

交换WhereSelectMany的顺序,查询就正常了:首先获取所有小猫的所有namenickname属性,然后只选择包含字符串Tom的那些。

List<String> listOfKittens = animals
    .SelectMany(i => i.Cat
         .SelectMany(s => new[] { s.name, s.nickname })
         .Where(m => m.Contains("Tom"))    
    ).ToList();

【讨论】:

  • 不错。非常适合我的场景。非常感谢克劳迪乌
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 2010-11-15
相关资源
最近更新 更多