Linq查询与嵌套的Order By?

时间:2019-03-01 19:16:56

标签: c# linq

嗨,我有以下类结构:

class Apple
{
    public IEnumerable<Banana> Bananas { get; set; }
}

class Banana
{
    public IEnumerable<Carrot> Carrots { get; set; }
}

class Carrot
{
    public DateTime DateCreated { get; set; }
    public IEnumerable<Dog> Dogs { get; set; }
}

class Dog
{
    public string Target { get; set; }
}

我正在尝试从Apple类型的集合中查询所有内容,其中Apples.Bananas.Carrots.Dogs.Target与我的输入匹配。我目前有。

var result = Apples.Where(apple => 
            apple.Bananas.Any(banana => 
                banana.Carrots.Any(carrort => carrort.Dogs.Any(dog => 
                    dog.Target.Equals(input)))));

我的困难是我现在意识到我只想要胡萝卜列表中的最新条目。

我无法弄清楚如何按DateCreated降序订购胡萝卜并在此查询中排在第一位。

我尝试了以下方法,但引发了异常:

var result = Apples.Where(apple =>
    apple.Bananas.Any(banana =>
        banana.Carrots.OrderByDescending(carrot =>
            carrot.DateCreated).First().Dogs.Any(dog =>
                dog.Target.Equals(input))));

异常Exception of type 'Antlr.Runtime.NoViableAltException

1 个答案:

答案 0 :(得分:0)

如果您不确定自己的LINQ查询,请务必对其进行简化。记住,LINQ将继续返回IEnumerable,直到您请求一个对象(First,ToArray,ToList等)为止。因此,以简单性和调试为名简化代码没有什么害处。

var ohGodMyEyes = Apples
   .Where(apple => apple.Bananas
       .Any(banana => banana.Carrots
           .OrderByDescending(carrot => carrot.DateCreated)));

var result = ohGodMyEyes
    .First().Dogs
    .Any(dog => dog.Target.Equals(input));