实现LINQ表达式参数

时间:2010-07-09 11:00:03

标签: c# linq

我正在使用我找到的接口,它有一个将LINQ表达式作为参数的方法。 如何实现此方法以使用LINQ表达式?我可以看到它非常有用,但是如何编写代码来使用它!!

它是一个存储库界面。

签名是......

IQueryable<T> Get(Expression<Func<T, bool>> criteria);

3 个答案:

答案 0 :(得分:9)

听起来你正在寻找这样的东西:

List<T> myList = new List<T>();
...
public IQueryable<int> Get(Expression<Func<int, bool>> criteria)
{
    return myList.Where(criteria.Compile()).AsQueryable();
}

这会将您的表达式criteria传递给linq-method Where。然后你可以这样称呼它:

foreach(var something in myClass.Get(o => o.someProperty == 10))
{
    ...
}

当然,这很愚蠢;最好只实施IEnumerable<T> ...

答案 1 :(得分:6)

IQueryable<T>.Where()重载,需要Expression<Func<T>>个参数。当假设这是一个Linq2Sql或Linq2Entities存储库时,这样的东西应该起作用

class MyRepository
{
    ObjectContext context = // initialize somehow;


    public IQueryable<int> Get(Expression<Func<int, bool>> predicate)
    {
        return context.SomeObject.Where(predicate);
    }
}

如果情况并非如此,并且您只有可枚举,则可以使用AsQuerably()作为链中的第一步将其转换为IQuerably,从而为您提供使用基于表达式的谓词的选项:

public IQueryable<int> Get(Expression<Func<int, bool>> predicate)
{
    return mySimpleList.AsQuerable().Where(predicate);
}

答案 2 :(得分:1)

这是一个谓词表达式;表示要包含数据的东西。

因此,要获得单个记录,您可以使用:

int rowId = 123;
var row = foo.Get(x => x.Id == rowId).Single();

或者为了使所有数据符合您可以使用的某些条件:

var allDeleted = foo.Get(x => x.IsDeleted).ToList();

请注意,这应该是可组合的,以获得更多乐趣:

var today = from row in foo.Get(x => x.DateCreated > DateTime.Today)
            orderby row.Name
            select new {row.Id, row.Name};