我正在使用我找到的接口,它有一个将LINQ表达式作为参数的方法。 如何实现此方法以使用LINQ表达式?我可以看到它非常有用,但是如何编写代码来使用它!!
它是一个存储库界面。
签名是......
IQueryable<T> Get(Expression<Func<T, bool>> criteria);
答案 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};