我看过很多帖子,但无法找到问题的答案。
我有很多使用Where条件的查询,如下所示。在代码中它看起来很丑陋,所以我想使用谓词(不知道是否可能)。
.Where(i => i.Timestamp <= date.ToUniversalTime() && i.Timestamp >= yearStart.ToUniversalTime())
我希望这成为或类似的东西
.WhereYearTotal(date)
因此可以在“WhereYearTotal”函数中评估条件。
编辑:
我已经尝试过扩展方法,但它似乎不适用于嵌套查询,例如:
var query = (from o in db.tableA
select new {
monthly = db.tableA.WhereYearTotal(date),
}).FirstOrDefault();
我得到一个Null引用异常。
答案 0 :(得分:1)
看看LINQKit。我会让你做你想做的事。
答案 1 :(得分:0)
这是使用extension methods.完成的。您需要为它创建静态类和静态方法。
static class MyHelper
{
public static IEnumerable<T> WhereYearTotal(this IEnumerable<T> input, DateTime d)
{
return input.Where( ... )
}
}
// usage : (the namespace for MyHelper must be in your using list)
myCollection.WhereYearTotal( DateTime.Now );
答案 2 :(得分:0)
只需为IQueryable编写自己的扩展方法:
public static IQueryable<TSource> WhereYearTotal<TSource>(
this IQueryable<TSource> source,
DateTime date ) {
return source.Where(i => i.Timestamp <= date.ToUniversalTime() && i.Timestamp >= yearStart.ToUniversalTime());
}
答案 3 :(得分:0)
Predicate
是作为参数传递给Where
的方法。你想要的不是谓词,而是extension method
namespace ExtensionMethods
{
public static class MyExtensions
{
public static IEnumerable<MyClass> WhereYearTotal(this IEnuerable<MyClass> source, DateTime date)
{
return source.Where(i => i.Timestamp <= date.ToUniversalTime() && i.Timestamp >= yearStart.ToUniversalTime())
}
}
}