LINQ: Group By + Где в предложении - PullRequest
4 голосов
/ 23 ноября 2010

Я пытаюсь реализовать T-SQL-эквивалент кода where in (select ...) в LINQ.

Это то, что у меня есть сейчас:

int contactID = GetContactID();
IEnumerable<string> threadList = (from s in pdc.Messages
                             where s.ContactID == contactID
                             group 1 by new { s.ThreadID } into d
                             select new { ThreadID = d.Key.ThreadID}).ToList<string>();

        var result = from s in pdc.Messages
                     where threadList.Contains(s.ThreadID)
                     group new { s } by new { s.ThreadID } into d
                     let maxMsgID = d.Where(x => x.s.ContactID != contactID).Max(x => x.s.MessageID)
                     select new {
                         LastMessage = d.Where(x => x.s.MessageID == maxMsgID).SingleOrDefault().s
                     };

Однако мой код выигралне компилируется из-за этой ошибки для ToList():

невозможно преобразовать из 'System.Linq.IQueryable<AnonymousType#1>' в 'System.Collections.Generic.IEnumerable<string>'

У кого-либо есть предложениякак это реализовать?Или какие-либо предложения о том, как упростить этот код?

1 Ответ

13 голосов
/ 23 ноября 2010

Ваш запрос возвращает набор анонимных типов;вы не можете неявно преобразовать его в List<<i>string</i>>.

Вместо этого вам следует выбрать саму строку.Вам не нужны анонимные типы.

Измените его на

var threadList = pdc.Messages.Where(s => s.ContactID == contactID)
                             .Select(s => s.ThreadID)
                             .Distinct()
                             .ToList();

var result = from s in pdc.Messages
             where threadList.Contains(s.ThreadID)
             group s by s.ThreadID into d
             let maxMsgID = d.Where(x => x.ContactID != contactID).Max(x => x.MessageID)
             select new {
                 LastMessage = d.Where(x => x.MessageID == maxMsgID).SingleOrDefault()
             };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...