使用LINQ表达式或规范模式访问Ingres数据库?

时间:2011-06-29 08:38:26

标签: linq specifications ingres

我正在开发一个WCF项目,该项目从多个数据源中提供业务信息。为了重用代码,我的BusinessContactService包含一个通用的存储库依赖项,定义为:

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

服务通过存储库查询数据源:

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

当数据源是sql server数据库时,它通过Entity Framework工作。但是当服务在Ingres数据库上运行时,它会出现问题,因为它的.NET数据提供程序或ODBC驱动程序不能与LINQ表达式一起使用。以下是我发现的一些解决方法:

    EF的
  1. Virtuoso data provider:由于它不是免费的,系统团队无论如何都不想安装它,我无法使用它。
  2. 自定义Ingres EF提供程序,显示为Entity Framework sample provider。这很有意思,但我恐怕没有制作时间表(下周!)
  3. 使用规范模式隐藏我的服务中LINQ表达式的使用。因此仍然在sql server规范实现中使用LINQ,而在Ingres的情况下使用ado.net。
  4. NHibernate.Linq。我对NHibernate知之甚少,但someone here said it works fine with ODBC我想它可能能够与Ingres建立LINQ表达式。
  5. 请对选项2 - 4提出建议。非常感谢!

1 个答案:

答案 0 :(得分:1)

首先,一点建议。对于你的通用界面,我认为最好揭露:

IQueryable<T> Query<T>();

因此,应用程序层将能够调用它并链接它想要的任何内容,例如:

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

对于你的问题,我发现,当没有EF提供者 - 或者你不能出于任何原因使用它时 - 使用Fluent Nhibernate的NHibernate是另一种选择。没有EF那么强大(代码优先,显然),但仍然是一个很好的后备。它支持最常见的linq运算符,它完全适合您的抽象设计。