我是一个实体框架(实际版本6)新手,并尝试做一些查询。
我的数据库看起来与此类似:
我尝试了一个查询(不正确),如:
Select *, st.StatusDescription from Product As p
Join Status As s On p.StatusId = s.Id
Join StatusTranslations As st on s.Id = st.StatusId
Where (...predicate...) And st.Language = 'en-US'
其中AsExpandable()是来自LinqKit的函数。
这就是我想要的SQL:
@ModelType IEnumerable(Of Product)
...
@For Each item In Model
@Html.DisplayFor(Function(modelItem) item.Status.StatusTranslations.StatusDescription)
Next
这样我就可以在我的视图中显示StatusDescription:
{{1}}
在我看来,我收到错误:
StatusDescription不是ICollection的成员(Of StatusTranslations)
问题是,vb.net查询应如何实现这一目标,并且是否需要更改数据库架构和/或视图?
答案 0 :(得分:0)
您的问题是不支持已过滤的is null
。我认为在这种情况下最简单的方法是首先加载Include
和Product
es然后加载翻译。我将告诉你如何在C#中实现它:
Status
现在在您看来,您可以这样做:
var products = db.Products.Include(p => p.Status)
.AsExpandable()
.Where(predicate);
var translations = products
.Select(p => p.Status.StatusTranslations
.FirstOrDefault(tran => tran.Language == "en-Us"))
.Load();
两个LINQ查询将所需数据加载到上下文中。 EF通过 relationship fixup 填充导航属性,因此您实际上可以找到@For Each item In Model
@Html.DisplayFor(Function(modelItem) item.Status.StatusTranslations
.FirstOrDefault().StatusDescription)
Next
。
一件重要的事情:你必须先禁用延迟加载:
item.Status.StatusTranslations.FirstOrDefault()
这是因为导航属性即使已填充,也不会标记为已加载。否则,解决它们仍会触发延迟加载。