【问题标题】:No Way to Query Connecting Table无法查询连接表
【发布时间】:2011-01-27 04:10:13
【问题描述】:

假设我有两个表,A 和 B,使用连接表 AB 建立多对多关系。

表 A

AID int

表 B

BID int

表 AB

AID int
BID int

我的任务是使用 linq to entity framework 4 查找 AB 中 AB.AID = 2 的所有行。

部分问题是实体模型中不包含 AB 表。只有 A 和 B 包含在多对多关系中。但是由于我不需要来自 B 的信息,因此为此任务涉及多对多连接将是一种浪费。

这使用 SQL 很简单,但我不知道如何使用 linq to Entity Framework。

【问题讨论】:

    标签: c# .net entity-framework linq-to-entities


    【解决方案1】:

    根据我的经验,解决此问题的最佳方法是向 AB 表添加一个主键,例如 ABID,以便它确实出现在您的上下文中。

    这样您的查询将如下所示:

    var q = from ab in context.AB
            where ab.BID == 2
            select ab;
    

    我知道这个解决方案并不完全理想,但它应该可以工作。

    【讨论】:

    • 因为 AB 表在两列之间必须是唯一的,所以两列构成一个主键。我认为这对于规范化是必要的。
    • 我将在 AB 表中有 3 列,ABID、AID、BID。主键是 ABID,然后我会为 AID + BID 添加唯一键/索引以防止重复。这有意义吗?
    • 这是有道理的,但我认为额外的列和索引不会朝着提高效率的方向发展。
    • @Jonathan:很公平。它绝对不是最有效的方法,但它是我在使用 EF 时发现的最好的方法。我很想看看其他人是否有更好的建议!
    【解决方案2】:
    var q = from a in Context.TableA
            where a.TableB != null
            select new 
            {
                AID = a.AID,
                BID = a.TableB.BID
            };
    

    【讨论】:

    • 我不确定使用什么 SQL 来获取 a.TableB.BID,但是使用第三个表查看 TableA 和 TableB 以及某种连接查找似乎不是非常低效当我只需要SELECT * FROM TableAB WHERE AID=2 时? EF真的这么差吗?
    • 恕我直言:不要过早优化。 “坏”是一款慢速应用,而不是一款以您认为可能慢的方式快速完成某事的应用。
    • 并不是说我不喜欢这个回复,但那是一个不回答。
    • ???我给了你一个答案,(1)有效,(2)应该表现良好。也许这不是您所要求的精确,但我在这里没有看到更好的建议。
    • 我的意思不是你的回答——我很感激。我说的是上面的评论。我已经开发了很长时间,并且知道如何以及何时进行优化。我只是对 EF 了解不多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2023-03-06
    相关资源
    最近更新 更多