2010-05-31 7 views
2

Je suis nouveau sur LINQ et je suis donc confronté à certaines requêtes dont je suis sûr qu'elles sont assez simples. En tout cas, je me cogne la tête depuis un moment, mais je suis perplexe.Aide Conversion de requête T-SQL en requête LINQ

Quelqu'un peut-il m'aider à convertir cette requête T-SQL en requête LINQ? Une fois que je vois comment il est fait, je suis sûr que je vais avoir une question sur la syntaxe:

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 

Juste pour montrer que je ai essayé de résoudre ce moi-même, voici ce que je suis venu avec jusqu'à présent, mais il ne compile pas, et encore moins de travail ...

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; 

Répondre

1
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()} 

Si vous voulez retourner un IQueryable<T>, vous devrez projeter dans une classe telle que votre RecentlyCommentedBlog. Une classe anonyme (ce que ma requête montre) ne se prête pas à être nommée comme un type de retour d'une méthode.

Si vous ne possédez pas de propriété BlogComments dans votre classe Blog, create an association.

+0

Merci, David. J'ai choisi de résoudre ce problème en ajoutant une propriété BlogComments à ma classe partielle Blog, comme vous l'avez suggéré. – campbelt

1

Je pense que je travaillais dehors, au cas où cela sera utile pour quelqu'un d'autre ...

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 }; 

J'essaie ing pour renvoyer le résultat de cette requête en tant qu'objet IQueryable. Je ne pouvais pas trouver un moyen de le faire sans créer une nouvelle classe, juste pour cette requête, appelée RecentCommentedBlog. Voici le code de cette classe:

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; 
    } 
} 

Quoi qu'il en soit, alors que cette solution semble fonctionner, je ne peux pas empêcher de penser, il est sûr d'être une meilleure façon d'avoir accompli cela.