Использовать выражения LINQ или шаблон спецификации для доступа к базе данных Ingres? - PullRequest
1 голос
/ 29 июня 2011

Я работаю над проектом WCF, который предоставляет деловую информацию из нескольких источников данных. Чтобы повторно использовать код, мой BusinessContactService содержит общую зависимость хранилища, определенную как:

public interface IRepository<T> {
   IQueryable<T> Find(Expression<Func<T, bool>> criteria);
} 

А сервис запрашивает источник данных через репозиторий как:

repo.Find(b => b.Name.Contains("abc"));

Когда источником данных является база данных sql-сервера, он работает через Entity Framework. Но когда служба работает в базе данных Ingres, возникает проблема, поскольку ее поставщик данных .NET или драйвер ODBC не работают с выражением LINQ. Ниже приведены некоторые обходные пути, которые я нашел:

  1. Поставщик данных Virtuoso для EF: поскольку он не бесплатный, и системная команда все равно не хочет его устанавливать, я не могу его использовать.
  2. Настройте поставщика Ingres EF, указав Пример поставщика Entity Framework . Это довольно интересно, но я боюсь не сделать график (к следующей неделе!)
  3. Скрытие использования выражения LINQ в моем сервисе с использованием шаблона спецификации. Поэтому все еще используйте LINQ в реализации спецификаций сервера sql, в то время как используйте ado.net для случая Ingres.
  4. NHibernate.Linq. Я немного знаю о NHibernate, но кто-то здесь сказал, что он отлично работает с ODBC , и я думаю, что он может быть в состоянии соединить выражение LINQ с Ingres.

Пожалуйста, дайте предложения по варианту 2 - 4. Большое спасибо!

1 Ответ

1 голос
/ 29 июня 2011

Прежде всего, небольшое предложение. Я думаю, что для вашего общего вмешательства было бы лучше разоблачить:

IQueryable<T> Query<T>();

Таким образом, прикладной уровень сможет вызывать его и связывать все, что захочет, например:

var temp = repo.Query<User>().Where(c => c.Email.Contains("@foo.com")).OrderBy(c => c.FirstName);

По вашему вопросу я обнаружил, что, когда нет поставщика EF - или вы не можете использовать его по какой-либо причине - NHibernate с Fluent Nhibernate - вполне альтернатива. Не такой мощный, как EF (сначала код, очевидно), но все же хороший запасной вариант. Он поддерживает наиболее распространенные операторы linq и прекрасно впишется в ваш абстрактный дизайн.

...