我正在尝试在没有FooBars.Max(Date)子集上按Bars排序Optional

很难用文字解释,所以这是我到目前为止得到的查询。

// Foos is of type DbSet<Foo> a "code first" EF entity
Foos.OrderBy(f => f.Bars
                  .Where(b => b.Optional == null)
                  .Max(b => b.Date));


该查询失败,并显示NotSupportedException


  无法比较类型的元素
  'System.Collections.Generic.ICollection`1'。只有原始类型,
  支持枚举类型和实体类型。


模型

public class Foo
{
    public int Id { get; set; }

    public virtual ICollection<Bar> Bars { get; set; } // one to many
}

public class Bar
{
    public int Id { get; set; }
    public DateTime Date { get; set; }

    public virtual Foo Foo { get; set; }
    public virtual ICollection<Optional> Optional { get; set; } // zero to many
}

public class Optional
{
    // omitted for brevity
}

最佳答案

Bar.Optional是一个集合,而不是单个引用。您不能将带有null的具有LINQ-to-Entities的集合进行比较。相反,您必须按Bars过滤,其中Optional集合不(!)具有任何元素:

Foos.OrderBy(f => f.Bars
                   .Where(b => !b.Optional.Any())
                   .Max(b => b.Date));


考虑到Max(b => (DateTime?)b.Date)Max(b => b.Date)集合可能为空并且因此没有最大Bars的可能情况,可能必须使用Foo而不是仅使用Date。我对此不是100%的确定。您应该显式测试空Bars集合的情况。

关于c# - 通过与条件的关系子集排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18721844/

10-11 01:13