Ошибка в преобразовании SQL в LINQ, как это решить? - PullRequest
0 голосов
/ 07 декабря 2011

У меня SQl-запрос работает нормально, мне нужно преобразовать его в LINQ и у меня возникли некоторые проблемы.

Мой рабочий SQL-запрос:

select d.UserID, d.Content, d.UpdateTime
from DiaryPosts as d
where d.UserID = 2
/* friends */
Union
select d.UserID, d.Content, d.UpdateTime
from DiaryPosts as d
join Friends as fr 
on d.UserID = fr.FriendID 
where fr.UserID = 2
/* following */
Union
select d.UserID, d.Content, d.UpdateTime
from DiaryPosts as d
join Followers as fl 
on d.UserID = fl.UserID
where fl.FollowerID = 2
/* ordenando por UpdateTime desc */
order by 3 desc

То, что я пробовал на основе моего собственного предыдущего вопроса :

var friends = (from u in db.User
                       join f in db.Friends
                       on u.ID equals f.FriendID
                       where f.UserID == userset.ID
                       orderby u.Nickname
                       select new FriendsSet { ID = u.ID, Nickname = u.Nickname, Thumbnail = u.Thumbnail }).ToList();

var followers = (from u in db.User
                         join f in db.Followers
                         on u.ID equals f.FollowerID
                         where f.UserID == userset.ID
                         orderby u.Nickname
                         select new FriendsSet { ID = u.ID, Nickname = u.Nickname }).ToList();

var diaryPosts = (from d in db.DiaryPosts
                              join e in db.EstadosDeAlma
                              on d.EstadosDeAlmaID equals e.ID
                              join u in db.User
                              on d.UserID equals u.ID
                              where d.UserID == userset.ID
                              select new DiaryPostsSet { 
                                  PostID = d.ID,
                                  EstadoDeAlmaID = e.ID,
                                  EstadoDeAlma = e.Title,
                                  Author = u.Nickname,
                                  Thumbnail = u.Thumbnail,
                                  UserID = u.ID,
                                  IsDuplicated = d.IsDuplicated,
                                  FriendID = d.FriendID,
                                  FriendName = u.Nickname,
                                  Time = d.UpdateTime,
                                  MessagesCount = d.FriendMessages.Count(m => m.DiaryPostsID == d.ID)
                              }).Take(6).ToList();

var diaryPostsUnion = diaryPosts.Union(friends).Union(followers).OrderBy(d => d.UpdateTime);

Ошибки, которые я получаю:

'System.Collections.Generic.List<MvcWebRole1.Models.DiaryPostsSet>' does not contain a definition for 'Union' and the best extension method overload 'System.Linq.ParallelEnumerable.Union<TSource>(System.Linq.ParallelQuery<TSource>, System.Collections.Generic.IEnumerable<TSource>)' has some invalid arguments

Instance argument: cannot convert from 'System.Collections.Generic.List<MvcWebRole1.Models.DiaryPostsSet>' to 'System.Linq.ParallelQuery<MvcWebRole1.Models.FriendsSet>'

1 Ответ

1 голос
/ 07 декабря 2011

Вы пытаетесь объединить последовательность одного типа с последовательностью другого типа. Это не имеет смысла - союзы должны быть одного типа, в основном.

Не совсем понятно, что вы пытаетесь сделать здесь, но я подозреваю, что вы не хотите профсоюза.

О, и если вы хотите, чтобы все это происходило в базе данных, избавьтесь от вызовов ToList.

РЕДАКТИРОВАТЬ: Хорошо, трудно понять, как именно ваши запросы LINQ соответствуют вашим запросам SQL, но в основном ваши предложения "select" должны выглядеть примерно так:

from d in db.DiaryPosts
// stuff here
select new { UserID = d.ID, d.UpdateTime, d.Content }

Используйте один и тот же анонимный тип в каждом запросе - одни и те же имена свойств и типы в том же порядке - и вы сможете использовать метод Union.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...