我使用帶有POCO的EntityFramework。
假設我有波蘇斯像這樣(簡化)的定義:帶有多條件的WHERE子句的LINQ查詢
class Class1
{
public int ID;
public int SomeNumber;
}
class Class2
{
public int ID;
public int SomeNumber;
}
class Class3
{
public int ID;
public int SomeNumber;
}
class SomeClass
{
public int ID;
public int? Class1ID;
public Class1 Class1;
public int? Class2ID;
public Class2 Class2;
public int? Class3ID;
public Class3 Class3;
}
我想從數據庫中獲取所有SomeClass
記錄,屬於一個非此即彼的Class1
,Class2
或Class3
其中ClassX.SomeNumber
等於一定數目的一個。
我寫了LINQ查詢,看起來像這樣:
Database DB = new Database(); // object context
var result = DB.SomeClass.ToList();
int SomeNumber = 1; // some number
List<SomeClass> retValue = result
.Where(x =>
{
int Number = 0;
if (x.Class1 != null)
Number = x.Class1.SomeNumber;
else if (x.Class2 != null)
Number = x.Class2.SomeNumber;
else if (x.Class3 != null)
Number = x.Class3.SomeNumber;
return Number == SomeNumber;
})
.ToList();
...但是retValue
不包含任何記錄。
解決方案
顯然我必須指定.Include
語句,因爲懶加載是殘疾人和x.Class1
,x.Class2
和x.Class3
總是有null
值。我感到羞愧,因爲我沒有明確說明懶惰加載被禁用 - 問題會很明顯。
但是由於拉吉斯拉夫的帖子,我提高了我的代碼如下所示:
Database DB = new Database(); // object context
int SomeNumber = 1; // some number
List<SomeClass> retValue = DB.SomeClass
.Include("Class1")
.Include("Class2")
.Include("Class3")
.Where(x =>
SomeNumber == x.Class1.SomeNumber ||
SomeNumber == x.Class2.SomeNumber ||
SomeNumber == x.Class3.SomeNumber)
.ToList();
我不知道LINQ到實體應執行自動空合併。
其實溶液(我通常會發現它自己,我問後不久),由於延遲加載禁用,我必須在運行'Where'子句之前執行'var result = DB.SomeClass.Include(「Class1」).include(「Class2」).include(「Class3」)''。然而,我認爲這是被接受的,因爲你教會了我如何改進我的代碼(直接在LINQ-To-Entities中使用'Where') – 2012-04-26 13:30:26