具有2个连接的.NET实体框架查询

时间:2017-02-09 10:25:07

标签: .net asp.net-mvc vb.net entity-framework

我是一个实体框架(实际版本6)新手,并尝试做一些查询。

我的数据库看起来与此类似:

enter image description here

我尝试了一个查询(不正确),如:

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查询应如何实现这一目标,并且是否需要更改数据库架构和/或视图?

1 个答案:

答案 0 :(得分:0)

您的问题是不支持已过滤的is null。我认为在这种情况下最简单的方法是首先加载IncludeProduct 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()

这是因为导航属性即使已填充,也不会标记为已加载。否则,解决它们仍会触发延迟加载。