我想做一些像本文所述的內容 。但是,這篇文章是從2006年開始的,需要作者寫的擴展方法。我希望此時有一些更內置的東西。
這裡的目的是保存一個方法,該方法只包含可翻譯為T-SQL的操作,並使用它在LINQ-to-SQL select語句中分配特定屬性。如果有一種根本不同的方式來做這個然後我嘗試過,那麼這也是一個有效的答案。
我該怎麼做?
我試過的
我有一個像這樣的查詢:
var theData = (
from inv in dc.Inventory
where inv.IsDeleted == false
join data in cdc.InventoryDatas
on inv.InvKey equals data.ReInvKey
where data.ReColKey == colKey
select new MyClass {
SerialNumber = inv.SerialNumber,
Data = InventoryData.DataExpression( data ),
Name = inv.Name,
}
);
InventoryData.DataExpression
的定義如下:
public static Expression<Func<InventoryData, string>> DataExpression = (
d => d.TextData != null ? d.TextData
: d.IntegerData != null ? d.IntegerData.ToString()
: d.DecimalData != null ? d.DecimalData.ToString()
: d.DateData != null ? d.DateData.ToString()
: d.BooleanData != null ? d.BooleanData.ToString()
: null
);
但這不太對勁。我怎樣才能做到這一點?
當僅從一個表中選擇數據時,以及當我沒有在賦值語句的右側為同一屬性組合其他表達式時,這很好用:
Data = InventoryData.DataExpression.Compile()( data )
一如既往
select InventoryData.CompiledDataExpression( data )
和
select data.GetData()
其中CompiledDataExpression
定義為
public static Func<InventoryData, string> CompiledDataExpression
= InventoryData.DataExpression.Compile();
和GetData
定義為
public string GetData() {
// execute the compiled delegete on this InventoryData
var ret = InventoryData.CompiledDataExpression( this );
return ret;
}
但是,委託實際上並未編譯為T-SQL。相反,拉取與表關聯的類型的整個對象,然後在本地執行委託。
當我嘗試完整查詢時出現錯誤,該查詢連接到其他表並將委託分配給幾個屬性中的一個,其中一些屬性從其他表中提取數據。