gpt4 book ai didi

c# - 为 IQueryable 生成表达式

转载 作者:行者123 更新时间:2023-11-30 14:48:42 24 4
gpt4 key购买 nike

<分区>

我正在使用 LINQ->WCF 数据服务->EF,它支持 LINQ 的一个子集,但有一些注意事项。一旦学习了各种技巧和解决方法,我就没有遇到任何问题,但我想制作一个可重用的表达式生成器,用于仅比较 Date DateTime 的一部分.

对于常规 EF,您可以使用 EntityFunctions.TruncateTime (EF<6) 或 DbFunctions.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> (或 Expression<Func<T, DateTime>> )和 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 转换为表达式,并且您无法将不受支持的函数传递到数据服务 EF。这使得所有天真的解决方案都变得不可能,据我所知,还需要手动操作表达式。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com