使用实体框架 4.1 进行多表连接,我应该使用 lambda 还是 LINQ?

Posted

技术标签:

【中文标题】使用实体框架 4.1 进行多表连接,我应该使用 lambda 还是 LINQ?【英文标题】:Multi table join using Entity framework 4.1, should I use lambda or LINQ? 【发布时间】:2011-09-21 13:39:47 【问题描述】:

我是实体框架的新手,我正在尝试将多表连接转换为使用实体框架。原始 SQL 看起来像这样

JOIN tab_NewsCommunities S1 ON S1.News_ID = tab_News.NewsID
inner join tab_communities com on S1.Community_ID = com.Community_ID and com.RecordStatus_ID = 2
JOIN tab_Communities c ON S1.Community_ID = c.Community_ID
JOIN tab_Favorites uf ON S1.Community_ID = uf2.Community_ID
        WHERE uf.[User_ID] = @UserId 

新的实体模型看起来像这样,我已经简化了一些。谁能帮我将 sql 转换为 LINQ 或 lambda?我在网上看过很多示例,但它们都是单表连接。谢谢

【问题讨论】:

【参考方案1】:

我建议您阅读 CRAIG STUNTZ 的 blog post。这个想法是,只要您的模型中有正确的关系,您就可以简单地使用导航链接来选择所有属性,而无需依赖 JOIN 运算符。老实说,这就是 LINQ 的美妙之处,如果你的模型能做到,为什么还要加入自己。

【讨论】:

有趣的阅读,我知道他要去哪里。问题是我如何通过第二个表连接。【参考方案2】:

只要您在 EF 设计器中定义了关系 b/w 表,就不必再次进行连接。只需要预先加载关联的实体。

var result =  context.News.Include("NewsCommunity.Communities")
                          .Include("NewsCommunity.Favorites")
                          .Where( n => n.NewsCommunity.Favorites.Any(f => f.UserId == userId));       

【讨论】:

感谢您的快速回复。似乎这是在正确的轨道上。我遇到了 n.NewsCommunity.Community.Favorites.Any 的问题,出于某种原因,在 NewsCommunity 之后它没有给我社区导航属性的选项。有什么想法吗?【参考方案3】:

您可以在最新版本的 Entity Framework 的 Include 方法中使用 lamda 表达式。然后,您可以使用第二个选择来深入了解关系。

var result = context.News.Include(x=>x.NewsCommunity.select(z=>z.Communities)).Where(...)

【讨论】:

以上是关于使用实体框架 4.1 进行多表连接,我应该使用 lambda 还是 LINQ?的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 4.1 代码优先映射到将主键作为外键列的表

我应该如何编辑实体框架连接字符串?

实体框架代码首先进行连接状态检查

实体框架 4.1 自引用

实体框架4.1代码优先映射问题

TypeORM 无关联关系的mysql多表连接查询