簡體   English   中英

將C#函數移動到表達式以在Entity Framework / SQL Select中使用

[英]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);

我希望我理解你的問題,看看這個討論。 您不需要額外的論證,但如何將事情安排在一起的想法可能適用於您的案例。

如何重用LINQ選擇帶參數的表達式

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM