在我正在使用的应用程序的数据库中,有一个记录具有“日期”字段。在代码中的许多位置,我们需要将其转换为会计年度,以进行分组,选择和过滤。所以这里有一些查询可能是什么样子的例子:
var query = from r in DB.records
let fy = r.Date.Month >= 10 ? r.Year + 1 : r.Year
where fy = 2010
select r;
现在我知道我可以编写一个Expression方法来使用相同的过滤器,但如果我想用它来选择和分组呢?我不想在所有查询中一遍又一遍地写第二行。能够这样做会很好:
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来重用。
提前致谢。
答案 0 :(得分:5)
如果您可以将其编写为SQL函数,则可以创建一个在C语言代码中使用的伪C#函数,并告诉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();