LINQ с помощью SelectMany, Group и Take - PullRequest
0 голосов
/ 03 января 2019

Я застрял с моим запросом.Может быть, кто-нибудь может мне помочь?У меня есть таблица с сообщениями и еще одна с получателями (1: N).Первоначально у меня был следующий запрос:

var messages = 
  (from message in query
  from receiver in message.ReceiverList
  where ... // some message and receiver checks
  select new { Message = message, Receiver = receiver }
  ).GroupBy(m => m.Message);

, который работал нормально и возвращал сообщения, каждое со списком получателей.В запросе SQL не было GROUP BY.

Теперь мне нужно принять только первые 5 сообщений и независимо от того, как я пишу запрос, он терпит неудачу.Я попытался добавить OrderBy и Take к этому как этот

var messages = 
  (from message in query
  from receiver in message.ReceiverList
  where ... // some message and receiver checks
  select new { Message = message, Receiver = receiver }
  ).GroupBy(m => m.Message).OrderBy(x => x.Key.Id).Take(5);

, но затем это не удалось из-за "Метод или операция не реализована".

Я также пытался написать order by до select, а затем он потерпел неудачу из-за GroupBy, так как он был переведен как

TOP 5 ... FROM ... WHERE ... 
GROUP BY message.ID 
ORDER BY message.ID ASC

Я даже попробовал довольно плохоищет вариант фильтрации получателей дважды:

var messages = query
                .Where(<message conditions> &&
                    message.ReceiverList.Any(<receiver conditions>) 
                .Select(message => new
                {
                    Message = message,
                    Receivers = message.ReceiverList
                        .Where(<receiver conditions>)
                })
                .Where(message => message.Receivers.Count() > 0)
                .OrderBy(message => message.Message.Id)
                .Take(5)
                .ToList();

Но это возвращает только первые пять строк таблицы, а мне нужны первые 5 сообщений со всеми их получателями.

Что быбыть правильным способом просто принять 5 сообщений?

...