2011-03-14 123 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();