2011-03-14 117 views
2

我试图从这个Linq查询得到的是所有广告的列表,其中LogType.IsStatus == true的最新关联日志的LogType.Name的Confirmed或Renewed。要清楚,广告有许多日志,每个日志有一个LogType。到目前为止,我有以下内容,但它给我一个LastOrDefault上的错误System.NotSupportedException。Linq的子查询与让

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(); 

回答

5

LastOrDefault()在LINQ是不支持的实体(见here)。

您可以解决这通过在let子查询更改order by子句的order bydescending然后用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

查询似乎要处理,但我似乎得到一个System.NotSupportedException:指定的方法是不是跟这个支持,当我通过广告在我看来,来循环:@ foreach(模型中的var item)。我错过了一些简单的东西吗 – Jay 2011-03-14 14:08:05

+0

它是否说不支持哪种方法?你在'foreach(模型中的var item)'中迭代的'Model'集合是什么? – 2011-03-14 14:13:21

+0

我有广告上的强类型视图。如果我删除查询的ToList()部分,则会在foreach行上挂起异常,否则它会在查询本身上发生。 – Jay 2011-03-14 14:20:09

0

试试这个

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();