Нужна помощь в преобразовании SQL в EF4, пожалуйста - PullRequest
0 голосов
/ 23 декабря 2010

Мне нужна помощь в преобразовании этого оператора SQL в EF4:

Select Posts.PostID, Post, Comment
from Posts left join
 Comments on posts.PostID = Comments.PostID
    Where CommentID not in 
    (
     Select PostID
     from Votes
     where VoteTypeID = 4 --4 = flagged comment type
    )

В моей базе данных в таблице Votes хранятся либо PostID сообщаемых сообщений, либо CommentID сообщаемых комментариев в столбце Votes.PostID

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 23 декабря 2010
using (var context = new Model1Container())
{
  var posts = context.Posts.
    All((p)=> p.Votes.All((v) => v.VoteTypeId!=4));

  //Or
  var posts2 = from p in context.Posts
          where p.Votes.All((v)=> v.VoteTypeId != 4)
          select p;                
}

Обновление:
Исходя из моего понимания, вам нужны все посты, но для каждого поста вы хотите отфильтровать комментарии, в этом случае вы можете использовать ToDictionary:

var posts =
  context.Posts.
  //Include("Comments").
    ToDictionary(
      (p) => p, 
      (p) => p.Comments.Where((c)=> c.Votes.All((v) => v.VoteTypeId !=4))
    );

foreach (var item in posts)
{
  var post = item.Key;
  var comments = item.Value;
}

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

Update2:

var postsCollection = posts.Keys.ToArray();
var commentsCollection = posts.Values.ToArray();
0 голосов
/ 23 декабря 2010

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

var myPosts = from p in posts
              where !p.Comments.Any(c => c.Votes.VoteID != 4)
                PostId = p.PostId,
                //other field needed here
              };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...