Linq с подзапросом с Let - PullRequest
       3

Linq с подзапросом с Let

3 голосов
/ 14 марта 2011

Я пытаюсь получить из этого запроса Linq список всех объявлений, в которых самый последний связанный журнал с LogType.IsStatus == true имеет LogType.Name либо Подтверждено, либо Продлено.Чтобы было ясно, у рекламы есть много журналов, и у каждого журнала есть один тип журнала.Пока у меня есть следующее, но это выдает ошибку System.NotSupportedException в LastOrDefault.

var adverts = (from a in database.Adverts
                      let lastLog = (from l in a.Logs
                                     where l.LogType.IsStatus == true
                                     orderby l.Created_at
                                     select l).LastOrDefault()
                      where (lastLog != null)
                            &&
                            (lastLog.LogType.Name == "Confirmed" || lastLog.LogType.Name == "Renewed")
                            orderby a.Created_at descending
                      select a).ToList();

Ответы [ 2 ]

8 голосов
/ 14 марта 2011

LastOrDefault() не поддерживается в LINQ to Entities (см. здесь ).

Вы можете обойти это, изменив предложение order by в своем подзапросе let на order by descending, а затем вместо него используйте FirstOrDefault().

var adverts = (from a in database.Adverts
               let lastLog = (from l in a.Logs
                              where l.LogType.IsStatus == true
                              orderby l.Created_at descending
                              select l).FirstOrDefault()
               where (lastLog != null)
                     &&
                     (lastLog.LogType.Name == "Confirmed" || lastLog.LogType.Name == "Renewed")
                      orderby a.Created_at descending
               select a).ToList();
0 голосов
/ 14 марта 2011

попробуйте

var lookingType = new string[]{"Confirmed", "Renewed"};

var result = database.Adverts
  .Where(entry 
    => entry.Logs.Count() > 0 && entry.Logs.Any(log => log.LogType.IsStatus))
  .Select(entry 
    => new { data = entry, 
       lastLog = entry.Logs.OrderByDescending(log => log.Created_at).First() 
    })
  .Where(entry => lookingType.Contains(entry.lastLog.LogType.Name))
  .Select(entry => entry.data).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...