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

时间:2011-05-24 10:16:03

标签: entity-framework architecture entity-framework-4.1 nhibernate-criteria

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

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

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

OR

我希望学生(State = CA OR State = FL) AND GPA = 4.0 AND GENDER = M

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

我目前使用NHibernate进行此操作。 NHibernate中的Criteria API非常适合这样做。但是,NHibernate有一个主要的错误,那就是它不允许在1:多表上进行多次连接。

因此,例如如果我有一个包含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 个答案:

答案 0 :(得分:0)

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

public class Category {
    public virtual string CATCODE{get;set}
    public virtual IList<Answer> Answers{get;set;}
}

然后你可以这样做:

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

我甚至确定有更好的方法来编写此查询,但重点是它是可能的。