.net EF代码优先:可以转换为SQL的方法

.net EF代码优先:可以转换为SQL的方法,.net,linq,entity-framework,ef-code-first,expression-trees,.net,Linq,Entity Framework,Ef Code First,Expression Trees,我正在寻找一种方法来创建一个函数,该函数可用于将转换为SQL的Linq查询。当我们使用LINQtoSQL时,我提出了一个类似的问题。答案是映射到数据库中的UDF。我们之所以使用代码优先模型,是因为模型定义很干净,但不幸的是,据我所知,没有办法映射到函数,映射到存储的过程(我想这是因为代码首先应该生成db,我不应该向它添加东西)。对我来说,这似乎不太可能实现规模化,因为它不允许用简单的方法来处理可能随着时间推移而演变的低效率,但这既不存在也不存在 无论如何,我知道我可以定义谓词表达式,将其转换为S

我正在寻找一种方法来创建一个函数,该函数可用于将转换为SQL的Linq查询。当我们使用LINQtoSQL时,我提出了一个类似的问题。答案是映射到数据库中的UDF。我们之所以使用代码优先模型,是因为模型定义很干净,但不幸的是,据我所知,没有办法映射到函数,映射到存储的过程(我想这是因为代码首先应该生成db,我不应该向它添加东西)。对我来说,这似乎不太可能实现规模化,因为它不允许用简单的方法来处理可能随着时间推移而演变的低效率,但这既不存在也不存在

无论如何,我知道我可以定义谓词表达式,将其转换为SQL,以便在查询中使用,如下所示:

public static Expression<Func<MyEntity, bool>> FilterMe(int comparisonNumber)
{
    return x => x.SomeProperty == comparisonNumber;
}

var query = MyEntities.Where(FilterMe(1));
有没有办法在表达式函数中构建
GetEndDate
?当我在查询中长时间编写时,
GetEndDate
中的代码可以很好地转换为SQL,但是它很长,阅读起来很混乱

编辑-哦,在有人回答“使用SQLFunctions for DateAdd”之前,我的例子就是..一个例子。我还想用很多其他的方法。提前感谢。

您可以试试LinqKit:
使用.AsExpandable()和.Compile(),它允许在Linq查询中使用表达式。

您尝试过吗?i、 例如,返回一个
表达式
,并使查询
where GetEndDate(m)为Yes,这将不起作用。你会得到一些类似“无法比较
表达式
日期时间
”的东西。你试过我的答案了吗?
var query = from m in MyEntities
            let endDate = GetEndDate(m.Start, m.Duration)
            where endDate <= DateTime.Now
            select m;