6

我正在寻找一种方法来创建一个可以在我的 Linq 查询中使用的函数,该函数将转换为 SQL。当我们使用 Linq-to-SQL 时,我提出了一个类似的问题。答案是映射到数据库中的 UDF。由于模型定义的简洁性,我们使用代码优先模型,但不幸的是,据我所知,没有办法定义函数、映射到函数和映射到存储的过程(我猜这个想法是代码首先应该生成数据库,我不应该向它添加东西)。对我来说似乎不是很有可扩展性,因为它没有简单的方法来处理可能随着时间而演变的低效率,但这既不是这里也不是那里......

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

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

var query = MyEntities.Where(FilterMe(1));

这是否仅适用于返回的表达式bool?我正在寻找类似的东西:

var query = from m in MyEntities
            let endDate = GetEndDate(m.Start, m.Duration)
            where endDate <= DateTime.Now
            select m;

有什么方法可以构建GetEndDate表达式函数吗?当我在查询中长期编写代码时,其中的代码GetEndDate可以很好地转换为 SQL,但它很长而且阅读起来很混乱。

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

4

1 回答 1

3

您可以尝试使用带有 .AsExpandable() 和 .Compile() 的 LinqKit:http : //www.albahari.com/nutshell/linqkit.aspx,它允许在 Linq 查询中使用表达式。

于 2012-07-02T10:41:30.423 回答