将SqlServer Query转换为LINQ

时间:2014-01-17 07:43:39

标签: c# linq sql-server-2008

我在SQL server 2008中编写了以下给定的查询:

(SELECT p.postid, 
         p.title, 
        p.disabled, 
        l.locationname 
  FROM   posts p 
        INNER JOIN categories c 
                 ON p.categoryid = c.categoryid 
        INNER JOIN users u 
                 ON p.userid = u.userid 
        INNER JOIN tags t 
                 ON p.tagid = t.tagid 
        INNER JOIN locations l 
                 ON p.locationid = l.locationid 
        LEFT JOIN postimages pm 
                ON p.postid = pm.postid 
 WHERE  p.categoryid = 1 
  GROUP  BY p.postid, 
            p.title, 
            p.disabled, 
            l.locationname) 
ORDER  BY p.postid DESC 

我想在LINQ中编写上述查询。

我尝试了一下,能够写下面的查询:

var objPosts = (from p in _dbcontext.Posts
                        join us in _dbcontext.Users on p.UserId equals us.UserId
                        join tag in _dbcontext.Tags on p.TagId equals tag.TagId
                        join cat in _dbcontext.Categories on p.CategoryId equals cat.CategoryId
                        join loc in _dbcontext.Locations on p.LocationId equals loc.LocationId
                        join img in _dbcontext.PostImages on p.PostId equals img.PostId into gj
                        from postimg in gj.DefaultIfEmpty()

                        where p.Disabled == false && p.CategoryId == userPost.CategoryId || p.UserId == userPost.UserId || p.TagId == userPost.TagId || p.LocationId == userPost.LocationId

                        orderby p.PostId descending

                        select new
                        {
                            PostId = p.PostId,
                            PostTitle = p.Title,
                            //ImageInfo = postimg.ImagePath,
                            //ThumbNailInfo = p.ThubNailInfo,
                            PostShortDescription = p.ShortDescription,
                            UserId = us.UserId,
                            UserName = us.Name,
                            TagId = tag.TagId,
                            TagTitle = tag.Title,
                            CategoryId = cat.CategoryId,
                            CategoryName = cat.CategoryName,
                            LocationId = loc.LocationId,
                            LocationName = loc.LocationName
                        });

我无法在LINQ中按逻辑应用组。任何人都可以请将我的SQL转换为LINQ。感谢

2 个答案:

答案 0 :(得分:0)

您的查询中缺少的部分是您没有选择任何内容......

你有连接好,左外连接ok,谓词(where),排序,但没有投影,没有group by。

下面应该开始:

group p by p.PostId into pg
select new {Post=p, Location=loc};

这将返回一个新对象的集合,其属性为Post和Location。

答案 1 :(得分:0)

 group new { p, l } by new
          {
            p.postid, 
            p.title, 
            p.disabled, 
            l.locationname
           } into g
  orderby g.Key.PostId descending 

 select new
          {
           g.key.postid, 
           g.key.title, 
           g.key.disabled, 
           g.key.locationname

           }