为以下条件创建谓词

时间:2012-03-12 06:12:20

标签: c# .net linq-to-sql predicate

我看过很多帖子,但无法找到问题的答案。

我有很多使用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引用异常。

4 个答案:

答案 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())
        }
    }   
}