[英]How to use one C# expression inside another C# expression for Entity Framework?
[英]Moving C# function to expression for use in Entity Framework / SQL Select
我有一些小的C#函數和來自視圖的計算cols,我想轉移到Expressions,以便它們直接針對本機T / SQL中的數據源執行。
我可以在Select中內聯這個,但是我想把它移到一個常用的函數來重復使用和測試。
var results = context
.Products
.Select(p => new StockDto
{
Stock = p.GoodStock - p.LiveStock // Real version is more complex.
});
我已經嘗試創建一個返回表達式的函數,但C#嘗試分配表達式而不是表達式的結果,並且不會編譯。 使用以下Expression變量也不編譯。
public static readonly Expression<Func<DataModel.Product, int>> StockLevel =
expr => expr.GoodStock - 10;
我熟悉使用表達式附加到Where子句但我無法弄清楚如何創建一個從select語句返回一個字符串的Expression。
我想這樣做;
var results = context
.Products
.Select(p => new StockDto
{
Stock = StockExpression // StockExpression is written in C#
});
LinqKit似乎是關於使謂詞(Where子句)更容易使用,我無法看到如何編譯表達式樹。 是唯一的方法來手動編寫復雜的表達式樹(我想避免這樣做,因為它模糊了代碼的含義)?
LinqKit應該適合你。 您應該調用Invoke
以在另一個中使用一個表達式。
您有兩個“擴展”合並表達式的選項:
您可以在IQueryable
上調用AsExpandable
,以便它自動“擴展”表達式,如下所示:
var results = context
.Products
.AsExpandable()
.Select(p => new StockDto
{
Stock = StockLevel.Invoke(p)
});
或者在使用之前手動展開表達式,如下所示:
Expression<Func<Product, StockDto>> expression = p => new StockDto
{
Stock = StockLevel.Invoke(p)
};
expression = expression.Expand();
var results = context
.Products
.Select(expression);
我希望我理解你的問題,看看這個討論。 您不需要額外的論證,但如何將事情安排在一起的想法可能適用於您的案例。
private static Expression<Func<Singles, SearchSingles>> CreateSearchSelector()
{
return s =>
new SearchSingles
{
Foo = foo,
};
}
// Then use it like this
DataContext.Single.Select(CreateSearchSelector()).ToList();
看看Microsoft.Linq.Translations 。 它允許您使用表達式樹定義屬性,然后在查詢中使用它們。 對於選擇重用,確實LinqKit是你的朋友,或者看看這個答案,如果你真的想了解它是如何工作的:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.