2009-04-18 43 views
0

即時通訊使用LINQ到SQL 我有一個任務實體,它包含一組任務。讓我說我去查詢每個任務的所有任務的總持續時間。不理解這個異常

,我已經寫了下面的查詢:

return db.Missions.Select(m => new MissionNameDays() 
    { 
     Name = m.MissionName, 
     Days = m.Assignments.Sum(a => a.Duration()) 
    }); 

持續時間被簡單地定義爲(保持簡單)

public partial class Assignment 
{ 
    public int Duration() 
    { 
     return 1; 
    } 
} 

運行此代碼給了我以下異常:

當子查詢只有一個表達式可以在選擇列表中指定不與EXISTS一起引入。
描述:在執行 當前Web請求期間發生未處理的異常 。請查看 堆棧跟蹤以瞭解有關 錯誤的更多信息,以及它源自 的代碼。

異常詳細信息: System.Data.SqlClient.SqlException: 只有一個表達式可以在選擇列表中指定 當不引入子查詢 與存在。

我發現,如果我忽略持續時間()從查詢(又名

Days = m.Assignments.Sum(a => 1) 

它的工作原理有關的這個事業OK
什麼想法?

回答

0

Duration屬性在SQL語句中不能表達,因爲它是Assignments上的一個方法,所以表達式解析器不能正確地將它變成一個有效的SQL表達式。假設在Assignments表中有一些從哪個Duration開始被計算,嘗試使用與您在Select表達式中用於計算持續時間的表達式相同。

return db.Missions.Select(m => new MissionNameDays() 
    { 
     Name = m.MissionName, 
     Days = m.Assignments.Sum(a => a.LengthInMinutes/1440) 
    }); 

或者,您可以最終確定查詢,然後使用LINQToObjects進行選擇,該選擇將使用非列狀屬性/方法。既然你沒有在這個查詢中過濾任務,我想我會用這個方法。

return db.Missions.ToList().Select(m => new MissionNameDays() 
    { 
     Name = m.MissionName, 
     Days = m.Assignments.Sum(a => a.Duration()) 
    });