作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我对一遍又一遍地重写相同的查询感到有些厌倦。
repo.Query().Where(stuff => stuff.Timestamp >= minTime && stuff.Timestamp <= maxTime && ...);
我想我应该扩展 IQueryable
使用名为 IsInDateTimeRange
的方法, 并像这样使用它
repo.Query().IsInDateTimeRange(stuff => stuff.Timestamp, minTime, maxTime) ...
这对于 IEnumerable
来说非常容易, 只是一个 Func<T, DateTime>
和两个 DateTime
s,但是对于 IQueryable
我需要拍一张 Expression
我不太确定如何使用它。
这是我的尝试,但似乎没有用。
public static IQueryable<TValue> IsInDateTimeRange<TValue>(
this IQueryable<TValue> self,
Expression<Func<TValue, DateTime>> getMember,
DateTime minTime,
DateTime maxTime)
{
return self.Where(value => minTime >= getMember(value) && maxTime <= getMember(value));
}
最佳答案
您可以通过基于传递给方法的属性访问表达式手动构建表达式来完成此操作:
public static IQueryable<TValue> IsInDateTimeRange<TValue>(
this IQueryable<TValue> self,
Expression<Func<TValue, DateTime>> getMember,
DateTime minTime,
DateTime maxTime)
{
var getMemberBody = getMember.Body;
var filter = Expression.Lambda<Func<TValue, bool>>(
Expression.And(
Expression.LessThanOrEqual(
Expression.Constant(minTime),
getMemberBody
),
Expression.LessThanOrEqual(
getMemberBody,
Expression.Constant(maxTime)
)
),
getMember.Parameters
);
return self.Where(filter);
}
关于c# - 使用 IsInDateTimeRange 扩展 IQueryable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46072984/
所以我对一遍又一遍地重写相同的查询感到有些厌倦。 repo.Query().Where(stuff => stuff.Timestamp >= minTime && stuff.Timestamp
我是一名优秀的程序员,十分优秀!