Динамический запрос данных с использованием Entity Framework (EF)

#entity-framework #architecture #entity-framework-4.1 #nhibernate-criteria

#entity-framework #архитектура #entity-framework-4.1 #nhibernate-критерии

Вопрос:

Я хотел бы услышать некоторые отзывы о сценарии, который я пытаюсь реализовать. В настоящее время я реализовал этот сценарий, используя Criteria API для NHibernate, и мне было интересно, было ли что-нибудь подобное, реализованное для Entity Framework 4.1.

Мне нужно, чтобы конечный пользователь мог выбирать критерии фильтрации из пользовательского интерфейса и, таким образом, создавать запрос, который может содержать сложные И / ИЛИ критерии.

Например: пользователь может сказать: Я хочу, чтобы учащиеся с (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. Criteria API в NHibernate действительно великолепен для этого. Однако в 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 в Entity Framework. Я не знал, есть ли хороший способ делать такого рода вещи с использованием API.

Кто-нибудь может подсказать мне лучшее решение для достижения такой функциональности, если оно есть?

Хотелось бы услышать от экспертов NHibernate и EF, есть ли способы решить эту проблему.

Ответ №1:

Я действительно не знаю NHibernate или любой другой OR / M, кроме entity framework, но давайте предположим, что у вас есть объект, называемый 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)
  

Я даже уверен, что есть лучший способ написать этот запрос, но дело в том, что это возможно.