使用实体框架 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?的主要内容,如果未能解决你的问题,请参考以下文章