【问题标题】:Entity Framework Join 3 Tables实体框架加入 3 个表
【发布时间】:2014-01-29 20:33:49
【问题描述】:

我正在尝试加入三个表,但我无法理解方法...

我已完成加入 2 个表

        var entryPoint = dbContext.tbl_EntryPoint
            .Join(dbContext.tbl_Entry,
                c => c.EID,
                cm => cm.EID,
                (c, cm) => new
                {
                    UID = cm.OwnerUID,
                    TID = cm.TID,
                    EID = c.EID,
                }).
            Where(a => a.UID == user.UID).Take(10);

我想在 TID PK 中包含 tbl_Title 表并获得 Title 字段。

非常感谢

【问题讨论】:

标签: c# entity-framework entity-framework-4 entity-framework-5 entity-framework-4.1


【解决方案1】:

我认为使用基于语法的查询会更容易:

var entryPoint = (from ep in dbContext.tbl_EntryPoint
                 join e in dbContext.tbl_Entry on ep.EID equals e.EID
                 join t in dbContext.tbl_Title on e.TID equals t.TID
                 where e.OwnerID == user.UID
                 select new {
                     UID = e.OwnerID,
                     TID = e.TID,
                     Title = t.Title,
                     EID = e.EID
                 }).Take(10);

您可能应该添加orderby 子句,以确保Top(10) 返回正确的前十项。

【讨论】:

  • 非常感谢方法;工作清楚,但我想看到我问的答案,再次非常感谢。
  • @MarcinJuraszek : 如果我需要 ViewModel 来工作,我有必要加入表格吗?
  • 即使没有异步,这也不起作用。我有确切的场景,但查询抛出异常 [the_list_of_all_return_variables]' cannot be serialized 。 @marcinJuraszek - 你能看看stackoverflow.com/questions/42453123/…
  • 我更喜欢其他语法,除非涉及到连接......其他语法要复杂得多。我完全不明白。
【解决方案2】:

这是未经测试的,但我相信语法应该适用于 lambda 查询。当您使用此语法连接更多表时,您必须深入挖掘新对象以达到您想要操作的值。

var fullEntries = dbContext.tbl_EntryPoint
    .Join(
        dbContext.tbl_Entry,
        entryPoint => entryPoint.EID,
        entry => entry.EID,
        (entryPoint, entry) => new { entryPoint, entry }
    )
    .Join(
        dbContext.tbl_Title,
        combinedEntry => combinedEntry.entry.TID,
        title => title.TID,
        (combinedEntry, title) => new 
        {
            UID = combinedEntry.entry.OwnerUID,
            TID = combinedEntry.entry.TID,
            EID = combinedEntry.entryPoint.EID,
            Title = title.Title
        }
    )
    .Where(fullEntry => fullEntry.UID == user.UID)
    .Take(10);

【讨论】:

  • @Dan 出于好奇,是不是完全没有考虑使用 c、cm 和 ccm 的命名约定,或者只是使用 linq 和 lambda 执行连接所需的语法是可怕的?如果是前者,并且您想编辑帖子以获得更好的布局,请务必使用它。我仍然是实体框架的新手,并且仍然沉浸在最佳实践中,所以如果您有建议让这个答案对未来的用户更有说服力,我将不胜感激。
  • 我在评论时并没有给出确切的原因,但命名约定肯定会损害可读性(obv. 从 OP 复制)。此外,作为行首的逗号严重损害了可读性(对我来说是主观的),并且空格/缩进可以稍微改善。根据您的要求,我已经提交了包含所有这些(恕我直言)改进的修改。
  • 代码格式通常是有偏见的,但大多数人认为一般的东西看起来更好。至于命名约定,我曾经将事物称为非常短的名称,但我现在可以足够快地输入(甚至不考虑诸如 Intellisense 之类的东西),与冗长的命名相比,保存的少数字符不值得损害可读性。 “EntryID”与“EID”、“combinedEntry”与“cm”等。最终,其他人会阅读我的代码,我宁愿他们不会对我产生仇恨作为数量的线性函数他们必须阅读/维护我的代码行。
  • 我只是不明白反对逗号起始行的论点。我是一个坚定的信徒,因为它使注释个别条款/论点变得非常容易。而且看起来更漂亮:-)
  • 抛开可读性和语义不谈,在我看来,这比通常的from x in context.table join ... 更好。通过这种方式,您可以动态构建 Joins 和 Where 子句,并在以后添加分页和内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多