2012-07-23 49 views
2

我怎么能去这条SQL语句转换为LINQ:LINQ to SQL中包含

SELECT  [Content].[Content], [Content].ListOrder, [Content].ContentTypeId,   
      [Content].ContentId 
FROM  [Content] INNER JOIN 
      GroupContentPermission ON [Content].ContentId = GroupContentPermission.ContentId 
WHERE  GroupContentPermission.GroupId IN 
      (SELECT GroupId FROM GroupUser WHERE GroupUser.UserId = 169) 

回答

3

翻译到LINQ一般是除了在您的查询的情况下,一个特殊的技巧非常简单。你可以用自然的方式翻译你的选择,语言和语句,如下所示。在IN声明虽然情况下,你必须得到从内子查询第一的结果,然后检查内部子查询.Contains要检查的值。

var groups = 
    (from gu in GroupUser 
    where gu.UserId == 169 
    select gu.GroupId).ToList(); 

var result = 
    from p in GroupContentPermission 
    join c in Content on p.ContentId equals c.ContentId 
    where groups.Contains(p.GroupId) 
    select new { c.Content, c.ListOrder, c.ContentTypeID, c.ContentId }; 

// result should contain the same results as the SQL query 

这里有一些其他的资源对您有帮助,以及(你可以找到关于LINQ更多的资源和教程如果你做一个快速谷歌搜索有字面上数千):

+0

它的工作!谢谢你的帮助。资源也很有帮助! – Emon 2012-07-23 21:40:10

1

假设你已经链接与外键表中的模型(DBML/EntityFrameworks):

Contents.Where(x => x.GroupContentPermission.GroupUser.UserId == 169).Select(x => new { 
    x.Content, 
    x.ListOrder, 
    x.ContentTypeId, 
    x.ContentId }) 

或preferrably只是抓住的全部内容对象,并使用任何你想要的列:

var contents = Contents.Where(x => x.GroupContentPermission.GroupUser.UserId == 169).ToList(); 

foreach (var content in contents) 
    Console.Write(content.Content);