2012-03-12 78 views
0

我已经看过很多帖子,但无法找到我的问题的答案。为条件创建一个谓词条件

我有很多正在使用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(); 

我得到一个空引用异常。

回答

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); 
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()); 
} 
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()) 
     } 
    } 
} 
+0

其实在我发布这个问题后,我尝试了同样的方法,但是有一个问题。我不能使用扩展方法查询内部如下面:'code' VAR查询=(选自O在db.tableA \t \t \t \t \t \t \t \t \t选择新 \t \t \t \t \t \t \t \t \t \t \t { \t \t \t \t \t \t \t \t \t \t \t \t每月= db.tableA.WhereYearTotal(日期), \t \t \t \t \t \t \t \t \t \t \t})FirstOrDefault(); – Dilberted 2012-03-12 06:55:26