使用实体框架 (EF) 进行动态数据查询

Posted

技术标签:

【中文标题】使用实体框架 (EF) 进行动态数据查询【英文标题】:Dynamic Data Querying using Entity Framework (EF) 【发布时间】:2011-05-24 10:16:02 【问题描述】:

我想听听一些关于我正在尝试实施的方案的反馈。我目前已经使用 NHibernate 的 Criteria API 实现了这个场景,我想知道是否有任何类似的东西是为 Entity Framework 4.1 实现的。

我需要最终用户可以从 UI 中选择过滤条件,从而构建一个可以包含复杂 AND/OR 条件的查询。

例如:用户可以说:我想要(Zip Code = 92037 AND Gender = F) OR (ZipCode = 92101 and Gender = M)的学生

我想要(State = CA OR State = FL) AND GPA = 4.0 AND GENDER = M的学生

这些查询通常使用前端的树形控件构建。

我目前正在使用 NHibernate 进行这项工作。 NHibernate 中的 Criteria API 非常适合执行此操作。但是,NHibernate 有一个重大错误,那就是它不允许在 1:many 表上进行多个连接。

所以例如如果我有一个包含 CATCODE(类别代码)和答案的表,NHibernate 目前不会让我使用 Criteria API 进行多次查询。

所以我不能为例如做:WHERE CATCODE = A and Answer in (A,B,C) AND CATCODE = B and Answer in (V,H,Y)

由于这个限制,我一直在尝试从 NHibernate 迁移到实体框架。我不知道是否有一种使用 API 来做这类事情的好方法。

谁能告诉我实现此类功能的更好解决方案(如果有的话)?

如果有解决此问题的方法,我很乐意听取 NHibernate 和 EF 专家的意见。

【问题讨论】:

【参考方案1】:

我真的不知道 NHibernate 或除实体框架之外的任何其他 OR/M,但假设您有一个名为 Category 的实体,并且 category 与 Answers 有关系(例如,每个类别都有很多答案)。 所以 Category 实体看起来像:

public class Category 
    public virtual string CATCODEget;set
    public virtual IList<Answer> Answersget;set;

然后您可以执行以下操作:

Categories.Where(x=>x.CATCODE =="A").Where(x=>x.Answers.Any(l=>l.Name=="1" || l.Name=="2" || l.Name==3)

我什至确信有更好的方法来编写这个查询,但关键是它是可能的。

【讨论】:

以上是关于使用实体框架 (EF) 进行动态数据查询的主要内容,如果未能解决你的问题,请参考以下文章

EF框架学习---EF中的在线场景保存数据

改善使用实体框架时的搜索功能延迟

首先通过将类型作为参数传递来动态实例化实体框架数据库中的模型对象

011.EF实体框架(入门)

使用T4模板为EF框架添加实体根据数据库自动生成字段注释的功能

使用T4模板为EF框架添加数据库实体注释