【问题标题】:Creating methods that DO translate to SQL?创建可以转换为 SQL 的方法?
【发布时间】:2010-09-24 20:28:52
【问题描述】:

在我正在使用的应用程序的数据库中,有一条记录具有“日期”字段。在代码中的许多地方,我们需要将其转换为 Fiscal Year 以进行分组、选择和过滤。因此,这里有一些查询可能是什么样子的示例:

var query = from r in DB.records
            let fy = r.Date.Month >= 10 ? r.Year + 1 : r.Year
            where fy = 2010
            select r;

现在我知道我可以编写一个表达式方法来使用相同的过滤器,但是如果我想用它来选择和分组呢?我不想在所有查询中一遍又一遍地写第二行。能做到就好了:

var query = from r in DB.records
            let fy = r.Date.GetFY()
            where fy = 2010
            group r by fy into g
            select g.Count();

这样,不同的客户端可能有不同的 FY 定义等,并且它们都被定义在同一个地方。有没有办法做到这一点?编写普通的 GetFY 方法只会引发“无法转换为 SQL”(或实际上是什么)异常。显然,这可以在某种程度上转换为 SQL,我只是不知道是否可以以一种简单的方式重新创建 LINQ to SQL 以重用。

提前致谢。

【问题讨论】:

    标签: c# linq linq-to-sql


    【解决方案1】:

    如果您可以将其编写为 SQL 函数,则可以创建一个虚拟 C# 函数以在 LINQ 代码中使用,并告诉 LINQ 将其映射到您的 SQL 函数。映射是通过属性完成的。

    您需要执行以下操作:

    [Function(Name = "udf_GetFY", IsComposable = true)]
    public int  getFY(DateTime t)
    {
        return 5; // value doesn't matter
    }
    

    然后:

     var query = from r in DB.records 
            let fy = GetFY(r.Date) 
            where fy = 2010 
            group r by fy into g 
            select g.Count();
    

    【讨论】:

    • 我急切地等待进一步的阐述。 :) 或者您只是指您在映射到 SQL 函数的 DataContext 方法上装饰的属性(FunctionAttribute)?作为 LINQ 表达式中的方法调用,这实际上会在 OP 描述的情况下起作用吗?
    • 是的,我在考虑 FunctionAttribute。它应该按照他的描述工作(每个客户端都必须定义自己的 SQL GetFY 函数)
    • 非常酷,我从来没有想过我能做到。
    • 致所有人:奇怪的元注释:这个答案的分数将我的代表推到了 34669(和每日限制)---让我进入了代表分数的三向平局用户下的第 3 页和第 4 页的风口浪尖。
    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2020-07-01
    • 2010-11-04
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    相关资源
    最近更新 更多