【发布时间】:2015-03-12 13:05:30
【问题描述】:
在我们的应用程序中,我们希望为数据库中的各种条件提供标准方法。例如,我们有不同类型的事务,我们想创建标准方法来在其他查询中检索它们。但是,这给了我们错误:
方法 '' 没有支持的 SQL 转换
该方法可能如下所示:
public static bool IsDividend(this TransactionLog tl)
{
return tl.SourceTypeID == (int)JobType.Dividend || tl.SourceTypeID == (int)JobType.DividendAcct;
}
这样使用:
var dividends = ctx.TransactionLogs.Where(x => x.IsDividend());
当然,如果我将 IsDividend() 中的逻辑复制到 Where 子句中,这可以正常工作,但我最终会在很多地方复制此逻辑,并且如果该逻辑发生更改,则很难追踪。
我认为如果我将其转换为这样的表达式,它会起作用,但这不如能够使用方法的设置更可取:
public Expression<Func<TransactionLog, bool>> IsDividend = tl => tl.SourceTypeID == (int)JobType.Dividend || tl.SourceTypeID == (int)JobType.DividendAcct;
var dividends = ctx.TransactionLogs.Where(IsDividend);
有没有办法强制 Linq 将方法评估为表达式?或者将方法调用“转换”为 linq 查询中的表达式?像这样的:
var dividends = ctx.TransactionLogs.Where(tl => ToExpression(tl.IsDividend));
我们在应用程序中使用 Linq-to-SQL。
【问题讨论】:
-
表达式可以很容易地转换为方法(这就是它们的设计目的),但相反的操作是相当于反编译的任务。
标签: c# linq linq-to-sql expression-trees