实现LINQ表达式参数

Ste*_*eCl 6 c# linq

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

它是一个存储库接口.

签名是......

IQueryable<T> Get(Expression<Func<T, bool>> criteria);
Run Code Online (Sandbox Code Playgroud)

Blu*_*eft 9

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

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

这会将您的表达式传递criteria给linq-method Where.然后你可以像这样调用它:

foreach(var something in myClass.Get(o => o.someProperty == 10))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

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


San*_*ken 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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