包装IQueryable

时间:2013-07-09 21:04:48

标签: .net linq

我正在使用Entity Framework作为我的ORM,我的每个类都实现了一个基本上代表表结构的接口(每个字段只有一个readonly属性)。这些接口旨在在不同应用程序的程序集之间共享。他们不支持任何写作操作。

现在EF允许我使用IQueryable< EntityClass>的实例。我想拥有的是对IQueryable< IEntityInterface>的支持。这将是最重要的。不用说我希望能够使用接口属性执行Where操作。

它是否可行,或者我在这里浪费时间?我尝试实现自己的IQueryProvider和ExpressionVisitor,但到目前为止还没有很好的实现。关于LINQ的表达式结构,我几乎没有什么经验。它是要走的路还是另一种更好的方式?

1 个答案:

答案 0 :(得分:3)

我可能还没有完全理解你想对此做些什么,但我所看到的常见方法(我自己已经采取过)是使用泛型创建存储库。如果您为泛型设置了约束,则可以使用实体界面的属性。像这样......

public interface IRepository<T>
    where T : class, IEntityInterface 
{
    T FindById(int id);
    IQueryable<T> All { get; }
}

public class GenericRepository<T> : IRepository<T> 
    where T : class, IEntityInterface 
{
    public T FindById(int id) 
    {
        //Uses the Id property from the interface
        return All.Where(t => t.Id == id).Single();
    }

    public IQueryable<T> All
    {
        get
        {
            //Get DbContext instance from somewhere
            return _dbContext.Set<T>();
        }
    }
}

public interface IEntityInterface 
{
    int Id { get; }
}

然后,您可以通过使实体接口成为泛型类型来进一步进行泛型。这一切都与依赖注入和/或工厂模式(如果你进入那个)很好地配合。