c# – 实体框架包括Where

前端之家收集整理的这篇文章主要介绍了c# – 实体框架包括Where前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我有一个如下所示的查询
var forms = repo.GetForms().Where(f => f.SubForms.Any(sf => sf.Classes.Any(c => c.TermId == termId)));

从这里你可以看到我的架构如下:

SubForm有许多具有多个Term的Class.

我想要的是:

所有SubForms及其在特定术语中的类.

现在发生的事情是我获得了在特定术语中具有任何类的所有SubForm.这意味着SubForm会返回所有子类,而不仅仅是与Term相关的子类.

例如.我有2个术语,每个术语有2个类的子表单.此查询返回4个类而不是该特定术语中的2个类.

是否有任何Include(‘Expression’)可以用来表示我只想根据条件包含所有类?或者我的查询错了?

解决方法

用这个:
var subForms = repo.GetSubForms.Select(sf = new {
        SubForm = sf,Classes = sf.Classes.Where(c => c.TermId == termId)
    }).ToList()
    .Select(t => t.SubForm)
    .ToList();

更新:根据@ Slauma的评论

如果你想加载他们有任何具有Term by termId的Class的SubForms,你可以从end到begin;像这样:

var subForms = repo.Terms.Where(t => t.Id == termId).Select(t => new {
        Term = t,Class = t.Class,SubForm = t.Class.SubForm
    }).ToList()
    .Select(t => t.SubForm).ToList();

或者以最简单的方式,您可以在您的期限上使用Include,请参阅:

var subForms = repo.Terms.Include("Class.SubForm").Where(t => t.Id == termId)
                   .Select(t => t.Class.SubForm).ToList();

注意:正如我从您的问题中可以理解的那样,您有这样的关系:

SubForm has_many Class has_many Term

但是,您提供的代码显示的是这样的关系:

SubForm has_many Class
Term has_many Class

如果可以的话,请提出您的实体,或者更多地解释他们之间的关系.谢谢.

猜你在找的C#相关文章