在Entity Framework中使用dynamic where子句

时间:2010-11-16 19:52:50

标签: c# entity-framework data-access-layer

我正在尝试重新设计最初使用Raptier构建的数据访问层。 Raptier生成接受where子句作为参数传递给存储过程的方法。我真的需要保留现有的mesthos签名,所以我的新DAL也需要接受where子句。我想使用更新的数据访问技术和技术,因此考虑使用.Net 4.0中的Entity Framework。

然而,看起来我不能接受动态where子句而不实现一些强烈的reoutines来将它们解析为lamba表达式。有没有我错过的东西?我是否对实体框架感到不满意?

谢谢, 马克

4 个答案:

答案 0 :(得分:7)

有两个想法。

1)。 Dynamic LINQ,允许您将运算符定义为字符串。

var result = Northwind.Products
    .Where("CategoryId=2 And UnitPrice>3")
    .OrderBy("SupplierId");

2)。使用EntityFilter<T>(参见代码here),可以定义这样的过滤器:

IEntityFilter<Person> entityFilter =
    from person in EntityFilter<Person>.AsQueryable()
    where person.Name.StartsWith("a")
    where person.Id < 100
    select person;

您可以将IEntityFilter<Person>提供给能够过滤该查询的业务方法:

public static Person[] GetAllPersons(
    IEntityFilter<Person> filter)
{
    using (var db = ContextFactory.CreateContext())
    {
        IQueryable<Person> filteredList =
            filter.Filter(db.Persons);

        return filteredList.ToArray();
    }
}

答案 1 :(得分:0)

查看Rick Strahl的博客文章:http://www.west-wind.com/weblog/posts/160237.aspx。他的演示使用Linq to SQL,但它在EF中没有太大的不同。此方法涉及将IQueryable公开给业务层。这不是没有争议,但需要考虑的事情。

公开IQueryable后,您可以针对返回的集合编写LINQ查询。我不承诺你能够使用sprocs,但试一试。

答案 2 :(得分:0)

您可以使用ExecuteStoreQuery方法对数据库执行原始命令。 http://msdn.microsoft.com/en-us/library/ee358769.aspx

答案 3 :(得分:0)

面临同样的问题,现在停止使用的raptier可能是,那么

我有一个线索,因为我使用的是仅支持15个表/视图的精简版。 这是一个捷径,

总是在服务器中使用虚拟测试数据库,并生成所需的类,然后将其与类库解决方案合并,重建解决方案,并继续这样做到你想要的程度,

它的辛苦但它的工作。

需要更多的帮助,很高兴......