我正在尝试在没有Foo
的Bars.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/