Использование динамических предложений where в Entity Framework - PullRequest
2 голосов
/ 16 ноября 2010

Я пытаюсь изменить дизайн слоя доступа к данным, который был изначально построен с использованием Raptier.Raptier генерирует методы, которые принимают предложение where в качестве параметра для передачи в хранимый процесс.Мне действительно нужно сохранить существующие подписи mesthos, поэтому мой новый DAL также должен принимать условия where.Я хочу использовать более современные технологии и методы доступа к данным, поэтому подумывал об использовании Entity Framework из .Net 4.0.

Однако не похоже, что я могу принять динамические предложения where безреализовать некоторые интенсивные процедуры, чтобы разобрать их в выражения лямба.Я что-то пропустил?Мне не повезло с Entity Framework?

Спасибо, Марк

Ответы [ 4 ]

7 голосов
/ 16 ноября 2010

В голову приходят две идеи.

1). Dynamic LINQ , который позволяет определить, где операторы в виде строк.

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

2).Используйте что-то в качестве EntityFilter<T> (см. Код здесь ), что позволяет вам определить фильтр следующим образом:

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();
    }
}
0 голосов
/ 07 марта 2014

сталкиваются с той же проблемой, теперь прекращенный преступник может быть, ну, так что

У меня есть подсказка, поскольку я использую облегченную версию, которая поддерживает только 15 таблиц / представлений .. вот короткий путь ,,

всегда берите фиктивную тестовую базу данных на сервере ,, и генерируйте классы, которые вам нужны, затем объединяйте их с решением библиотеки классов, перестраивайте решение и двигайтесь дальше так, как вам нужно

это кропотливый, но его работа.

нужна дополнительная помощь, с радостью ...

0 голосов
/ 16 ноября 2010

Вы можете использовать метод ExecuteStoreQuery для выполнения необработанных команд для базы данных.http://msdn.microsoft.com/en-us/library/ee358769.aspx

0 голосов
/ 16 ноября 2010

Ознакомьтесь с постом Рика Страля здесь: http://www.west -wind.com / weblog / posts / 160237.aspx . В его демонстрации используется Linq to SQL, но в EF он не сильно отличается. Этот подход предполагает раскрытие IQueryable на бизнес-уровне. Это не без противоречий, но это то, что нужно учитывать.

С доступным IQueryable вы можете писать запросы LINQ к возвращенной коллекции. Я не обещаю, что вы сможете заставить его работать с sprocs, но попробуйте.

...