Справка Преобразование запроса T-SQL в запрос LINQ - PullRequest
2 голосов
/ 01 июня 2010

Я новичок в LINQ, и поэтому борюсь за некоторые запросы, которые, я уверен, довольно просты. В любом случае, я некоторое время бился об это, но я в тупике.

Может ли кто-нибудь здесь помочь мне преобразовать этот запрос T-SQL в запрос LINQ? Когда я увижу, как это делается, я уверен, что у меня возникнет вопрос о синтаксисе:

SELECT BlogTitle
FROM Blogs b
JOIN BlogComments bc ON
  b.BlogID = bc.BlogID
WHERE b.Deleted = 0
  AND b.Draft = 0
  AND b.[Default] = 0
  AND bc.Deleted = 0
GROUP BY BlogTitle
ORDER BY MAX([bc].[Timestamp]) DESC

Просто чтобы показать, что я пытался решить это самостоятельно, вот что я придумал до сих пор, хотя он не компилируется, не говоря уже о работе ...

var iqueryable = 
    from blog in db.Blogs
    join blogComment in db.BlogComments on
        blog.BlogID equals blogComment.BlogID
    where blog.Deleted == false
        && blog.Draft == false
        && blog.Default == false
        && blogComment.Deleted == false
    group blogComment by blog.BlogID into blogGroup
    orderby blogGroup.Max(blogComment => blogComment.Timestamp)
    select blogGroup;

Ответы [ 2 ]

1 голос
/ 01 июня 2010
from b in db.Blogs
where !b.Deleted
   && !b.Draft
   && !b.Default
   && !b.Deleted
order by b.BlogComments.Max(bc => bc.Timestamp) descending
select new {Blog = b, Count = b.BlogComments.Count()}

Если вы хотите вернуть IQueryable<T>, вам придется проецировать в такой класс, как ваш RecentCommentedBlog. Анонимный класс (что показывает мой запрос) не может быть назван в качестве возвращаемого типа из метода.

Если у вас нет свойства BlogComments в вашем классе Blog, создайте ассоциацию .

1 голос
/ 01 июня 2010

Я думаю, я решил, на случай, если это будет полезно для кого-то еще ...

var iQueryable = 
 from blog in db.Blogs
 join blogComment in db.BlogComments on
     blog.BlogID equals blogComment.BlogID
 where blog.Deleted == false
     && blog.Draft == false
     && blog.Default == false
     && blogComment.Deleted == false
 group blogComment by blog.BlogTitle into blogGroup
 let maxTimeStamp = blogGroup.Max(blogComment => blogComment.Timestamp)
 let commentCount = blogGroup.Count()
 orderby maxTimeStamp descending
 select new RecentlyCommentedBlog() { BlogTitle = blogGroup.Key, CommentCount = commentCount };

Я пытаюсь вернуть результат этого запроса в виде объекта IQueryable. Я не мог найти никакого способа сделать это, не создав новый класс, только для этого запроса, названный RecentCommentedBlog. Вот код для этого класса:

public class RecentlyCommentedBlog
{
    public string BlogTitle { get; set; }
    public int CommentCount { get; set; }

    public RecentlyCommentedBlog() { }

    public RecentlyCommentedBlog(string blogTitle, int commentCount)
    {
        BlogTitle = blogTitle;
        CommentCount = commentCount;
    }
}

В любом случае, хотя это решение, похоже, работает, я не могу не думать о том, что наверняка найдется лучший способ добиться этого.

...