【问题标题】:.NET Entity Framework query with 2 joins具有 2 个连接的 .NET 实体框架查询
【发布时间】:2017-02-09 10:25:06
【问题描述】:

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

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

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

 Dim products = db.Product.Include(Function(p) p.Status).Include(Function(p) p.Status.StatusTranslations).AsExpandable().Where(predicate).Where(Function(p) p.Status.StatusTranslations.Language.Equals("en-Us"))

其中 AsExpandable() 是来自 LinqKit 的函数。

这就是我想要的 SQL:

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'

这样我就可以在我的视图中显示 StatusDescription:

@ModelType IEnumerable(Of Product)
...
@For Each item In Model
    @Html.DisplayFor(Function(modelItem) item.Status.StatusTranslations.StatusDescription)
Next

在我看来,我收到了错误:

StatusDescription 不是 ICollection 的成员(的 状态翻译)

问题是,vb.net 查询应该如何实现这一点?是否需要更改数据库架构和/或视图?

【问题讨论】:

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


    【解决方案1】:

    您的问题是不支持过滤的Include。我认为在这种情况下,最简单的方法是先加载Products 和Statuses,然后再加载翻译。我将向您展示如何在 C# 中做到这一点:

    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();
    

    现在在你看来,你可以这样做:

    @For Each item In Model
        @Html.DisplayFor(Function(modelItem) item.Status.StatusTranslations
                                                 .FirstOrDefault().StatusDescription)
    Next
    

    两个 LINQ 查询将所需数据加载到上下文中。 EF 通过relationship fixup 填充导航属性,因此您实际上可以找到item.Status.StatusTranslations.FirstOrDefault()。

    一件重要的事情:你必须先禁用延迟加载:

    db.Configuration.LazyLoadingEnabled = false;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多