在实体框架中使用动态 where 子句

Posted

技术标签:

【中文标题】在实体框架中使用动态 where 子句【英文标题】:Using dynamic where clauses in Entity Framework 【发布时间】:2011-05-11 01:03:50 【问题描述】:

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

但是,看起来我不能接受动态 where 子句而不执行一些密集的重例以将它们解析为 Lamba 表达式。有什么我错过的吗?我对实体框架不走运吗?

谢谢, 马克

【问题讨论】:

也许你应该给我们看一些代码。我想很多人都不知道 Raptier 的样子。 【参考方案1】:

在此处查看 Rick Strahl 的博文:http://www.west-wind.com/weblog/posts/160237.aspx。他的演示使用 Linq to SQL,但在 EF 中并没有太大的不同。这种方法涉及将 IQueryable 暴露给业务层。这并非没有争议,但值得考虑。

通过公开 IQueryable,您可以针对返回的集合编写 LINQ 查询。我不保证你可以让它与 sprocs 一起工作,但试试看吧。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

想到了两个想法。

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

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&lt;Person&gt; 提供给能够过滤该查询的业务方法:

public static Person[] GetAllPersons(
    IEntityFilter<Person> filter)

    using (var db = ContextFactory.CreateContext())
    
        IQueryable<Person> filteredList =
            filter.Filter(db.Persons);

        return filteredList.ToArray();
    

【讨论】:

Steven 的选项 1 看起来最接近我们现在所做的。这可能行得通!感谢大家的回复! Dynamic LINQ 看起来很整洁。【参考方案4】:

面临同样的问题,现在 raptier 停产可能是,好吧

我有一个线索,因为我使用的是仅支持 15 个表/视图的 lite 版本.. 这是一条捷径,,

始终在服务器中获取一个虚拟测试数据库,并生成您想要的类,然后将其与您的类库解决方案合并,重新构建解决方案,然后继续进行到您想要的程度,

它很费力,但它的工作。

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

【讨论】:

以上是关于在实体框架中使用动态 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

使用 Func<T, string> lambda 动态构造 where 子句 - linq 到实体

动态 SQL 到 LINQ 实体框架

从选项(来自 rds - mysql)创建动态框架,提供带有 where 子句的自定义查询

如何在 EXECUTE IMMEDIATE 中使用动态 where 子句

实体框架 where 子句从特定列过滤

实体框架:Count() 在大型 DbSet 和复杂的 WHERE 子句上非常慢