我正在使用 LINQ->WCF 数据服务->EF,它支持 LINQ 的子集,但有一些注意事项。一旦学习了各种事情的技巧和解决方法,我就没有遇到任何麻烦,但我想制作一个可重用的表达式生成器来仅比较Date
的一部分DateTime
.
对于常规 EF,您可以使用EntityFunctions.TruncateTime
(EFDbFunctions.TruncateTime(EF6+),但这不适用于数据服务。
到目前为止,我的解决方案是重复构建这个混乱的 where 子句:
.Where(x => x.DateProperty.Year == DateToCompare.Year &&
x.DateProperty.Month == DateToCompare.Month &&
x.DateProperty.Day == DateToCompare.Day);
必须重复编写(但它有效)真是令人讨厌,所以我试图创建类似的东西:
.WhereDate(x => x.DateProperty, DateToCompare);
任何类似的东西都可以,只是简短、甜蜜和可读——我讨厌重复的、不必要的代码。
结构不是问题,我知道我需要一些东西IQueryable<T>
, Func<T, DateTime>
(or Expression<Func<T, DateTime>>
), and DateTime
并返回IQueryable<T>
.
public static IQueryable<T> WhereDate<T>(this IQueryable<T> data, Func<T, DateTime>> selector, DateTime date)
{
return data.Where(/*Something*/);
};
我遇到麻烦的地方是采用这个并构建一个可以放入该 where 子句中而不违反表达式树的限制的表达式。我不完全确定如何获取现有查询并将我自己的 where 语句添加到表达式中而不执行.Where
,我认为这可能是这里的关键。我想我需要接受Expression<Func<T, DateTime>>
并构建一些使用它来添加Expression<Func<T, bool>> to the tree and return it as an
IQueryable`.
有人有这方面的经验吗,或者知道我应该阅读哪些文件?
这里最大的障碍是您无法将基于语句的 lambda 转换为表达式,并且无法将不支持的函数传递到数据服务中orEF。这使得所有简单的解决方案都变得不可能,据我所知,只剩下手动表达操作。