我如何阅读表达式的内容?

时间:2014-10-18 01:18:11

标签: c# .net expression linq-expressions

我有一个类作为某种类型的存储库,并授予对数据库的访问权限。我正在尝试自定义它以允许使用表达式进行查询。

所以,我希望能够做到这一点:

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
}

我该怎么做?

2 个答案:

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