使用Entity Framework 4.1进行多表连接,我应该使用Lambda还是LINQ?

4

我是Entity Framework的新手,正在尝试将一个多表连接转换为使用Entity Framework。原始的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吗?我在网上看到了很多示例,但它们都是单表连接。谢谢。
3个回答

4
我建议您阅读CRAIG STUNTZ的这篇博客文章。他的想法是,只要您的模型关系正确,就可以使用导航链接来选择所有属性,而不必依赖JOIN运算符。老实说,这就是LINQ的美妙之处,如果您的模型能够完成JOIN操作,为什么还要自己去做呢?

有趣的阅读,我明白他的意思。问题是如何跨越第二个表连接。 - NullReference

1
只要在EF设计器中定义了表之间的关系,就无需再进行连接操作。只需要急切加载相关实体即可。
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之后它没有给我Community导航属性的选项。有什么想法吗? - NullReference

1

在最新版本的Entity Framework中,您可以在Include方法内部使用lambda表达式。然后,您可以使用第二个select来深入关系的额外层。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接