2011-08-19 68 views
4

我想翻譯下面的查詢到實體框架:實體框架相當於SQL「IS NULL」

SELECT   Subjects.Name 
FROM    Subjects LEFT OUTER JOIN 
         Projects_Subjects ON Subjects.ID = Projects_Subjects.Section_ID 
WHERE    (Projects_Subjects.Project_ID IS NULL) OR 
         (Projects_Subjects.Project_ID <> 2) 

哪裏科目是subject.ID一個簡單的表格,subject.Name和Projects_Subjects是一個表通過Projects_Subjects.Project_ID和Projects_Subjects.Subject_ID列實現主題和項目之間的多對多關係。

此查詢工作正常使用SQL,它返回一個尚未與該項目相關的ID爲所有科目= 2

我想這個轉換爲LINQ到實體。到目前爲止,我有:

db.Subjects.Where(s => s.Projects == null || !s.Projects.Select(p => p.ID).Contains(ProjectID)) 

,編譯器是高興盡可能語法去,但在運行時我得到以下錯誤:

'System.Data.Objects.DataClasses.EntityCollection`1'. Only primitive types (such as Int32, String, and Guid) and entity types are supported. 

沒有其他信息真的。據我可以告訴它不喜歡s.Projects == null位,因爲它工作正常,如果我拿出來。問題是:如何在實體集合上執行該檢查?

+0

聽起來像很多的問題,空值和實體框架:http://stackoverflow.com/questions/682429/how-can-i-query-for-null-values-in-entity-framework http://stackoverflow.com/questions/1126133/linq-to-sql-nullable-types-in-where-clause http://stackoverflow.com/questions/2411894/handling-null-values-in-where-子句使用LINQ到SQL http://stackoverflow.com/questions/586097/compare-nullable-types-in-linq-to-sql http://stackoverflow.com/questions/2097539/linq- where-column-null-reference-not-same-column-null –

+1

沒關係,我是個白癡。沒有必要檢查空值,因爲這是默認狀態......查詢工作正常,但沒有s.Projects == null位。 –

回答

1

您並未檢查列爲空,而是將關聯的屬性(另一個實體)檢查爲null。正如你指出的那樣,這是默認狀態。

您基本上得到的異常意味着只有POCO類型可以發送到SQL,以便比較SQL語句的where/order語句。英孚認爲你試圖在這裏比較對象,如此抱怨。

+0

感謝您的解釋,使事情更清晰。 –

4

答案是我是個白癡。 linq到實體查詢的默認值是它將返回所有內容,而你只需要從那裏減去。所以簡單地

db.Subjects.Where(s => !s.Projects.Select(p => p.ID).Contains(ProjectID)) 

其實做我想做的事......抱歉浪費時間。

0

像這樣?

var subjects = from subject in dc.GetTable<Subjects>() 
           join entityProjects_Subjects in dc.GetTable<Projects_Subjects>() 
            on subject.ID equals entityProjects_Subjects.Section_ID into tempProjects_Subjects 
           from projects_subjects in tempProjects_Subjects.DefaultIfEmpty() 
           where projects_subjects.Project_ID != 2 || projects_subjects == null 
           select new 
           {         
            Name = subject.Name 
           };