我有一个类作为某种类型的存储库,并授予对数据库的访问权限。我正在尝试自定义它以允许使用表达式进行查询。
所以,我希望能够做到这一点:
IList<MyClass> myList = myRepository.GetBy(x => x.Name == "SomeName");
//and...
IList<MyClass> myList2 = myRepository.GetBy(x => x.Name == "SomeName" && x.ID = 5);
这是我需要在存储库功能上使用的:
public IList<T> GetBy(Expression<Func<T, bool>> expression)
{
//Set up the query, etc
//I'm at the WHERE clause, and I need to get the property(ies) name(s) of the expression and their values to properly set the WHERE
}
我该怎么做?
答案 0 :(得分:1)
你想要做的是:
IList <MyClass> myList2 = myRepository.GetBy (x => x.Name == "SomeName" && x.ID
= 5);
确实,您可以代表x => x.Name == "SomeName" && x.ID = 5 with Expression <Func <T, bool >>
但也可以仅使用委托Func <T, bool>
。
无论采取哪种方式,数据始终都来自IEnumerable <T>
,因此您始终会使用Where
方法(无论何时使用命名空间System.Linq
),它都接受为参数委托Func <T, bool>
。如果对象IEnumerable <T>
是DbSet <T>
,则会在sql查询中转换委托Func <T, bool>
。请记住,正在使用的Linq查询仅在使用查询数据时执行,或者与方法ToList ()
或ToArray ()
一致。
例如:
IEnumerable <MyClass> list = ...
来自您从EntityFramework的DbSet获取数据的任何地方
var query = list.Where (x => x.Name == "SomeName" && x.ID = 5);
查询是一个查询,它在完成之前不包含任何数据
foreach (var x in list) is being consumed, so the query is executed
{
var c = x.Name;
}
或者
`var temp = query.ToList ();`
此力量存储在List <MyClass>
中
有了这一切,我想说,如果你使用EntityFramework的DbSet,那么会发生委托Func <T, bool>
转换为sql查询,以便数据管理器负责过滤数据(应该是这样) 。
仅此一点,您就必须简单地使用您的方法
public IList <T> GetBy (Func <T, bool> expression)
{
origen.Where (expression).ToList();
}
答案 1 :(得分:-1)
如果我理解你的问题,你应该从基础通用存储库接口继承你的存储库接口。
public interface IRepositoryBase<TEntity>
{
IList<TEntity> GetBy(Expression<Func<TEntity, bool>> expression)
}
和基础存储库实现的存储库实现
public abstract class RepositoryBase<TEntity>: IRepositoryBase<TEntity>
{
public MyEntities EntitiesContext { get; set; }
public IList<TEntity> GetBy(Expression<Func<TEntity, bool>> expression)
{
return EntitiesContext.Set<TEntity>().Where(filter).ToList()
}
}