gpt4 book ai didi

c# - 将 C# 函数移动到表达式以在 Entity Framework/SQL Select 中使用

转载 作者:行者123 更新时间:2023-11-30 16:02:26 25 4
gpt4 key购买 nike

我有一些小的 C# 函数和来自 View 的计算列,我想将它们移至表达式,以便它们直接针对 native T/SQL 中的数据源执行。

我可以在 Select 中内联执行此操作,但我想将其移至通用函数以供重用和测试。

var results = context
.Products
.Select(p => new StockDto
{
Stock = p.GoodStock - p.LiveStock // Real version is more complex.
});

我已经尝试创建一个返回表达式的函数,但 C# 尝试分配表达式而不是表达式的结果并且不会编译。使用以下表达式变量也不会编译。

public static readonly Expression<Func<DataModel.Product, int>> StockLevel = 
expr => expr.GoodStock - 10;

我熟悉使用表达式附加到 Where 子句,但我不知道如何创建从 select 语句返回字符串的表达式。

我想这样做;

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);

关于c# - 将 C# 函数移动到表达式以在 Entity Framework/SQL Select 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37598470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com