1

我正在开发一个 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 表达式一起使用。以下是我发现的一些解决方法:

  1. EF 的Virtuoso 数据提供者:因为它不是免费的,而且系统团队也不想安装它,所以我不能使用它。
  2. 自定义 Ingres EF 提供程序,如实体框架示例提供程序所示。这很有趣,但我恐怕不会做出时间表(下周!)
  3. 通过使用规范模式在我的服务中隐藏 LINQ 表达式的使用。因此在 sql server 规范实现中仍然使用 LINQ,而在 Ingres 案例中使用 ado.net。
  4. NHibernate.Linq。我对 NHibernate 知之甚少,但这里有人说它与 ODBC 一起工作得很好,我猜它可能能够将 LINQ 表达式与 Ingres 连接起来。

请就选项 2 - 4 提出建议。非常感谢!

4

1 回答 1

1

首先,一点建议。对于您的通用干扰,我认为最好公开:

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 运算符,并且非常适合您的抽象设计。

于 2011-06-29T08:48:57.557 回答