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

使用LINQ表达式或规范模式访问Ingres数据库?,linq,specifications,ingres,Linq,Specifications,Ingres,我正在从事一个WCF项目,该项目从多个数据源中提供业务信息。要重用代码,my BusinessContactService包含一个通用存储库依赖项,定义如下: public interface IRepository<T> { IQueryable<T> Find(Expression<Func<T, bool>> criteria); } 当数据源是sql server数据库时,它通过实体框架工作。但是,当服务在Ingres数据库上运行

我正在从事一个WCF项目,该项目从多个数据源中提供业务信息。要重用代码,my BusinessContactService包含一个通用存储库依赖项,定义如下:

public interface IRepository<T> {
   IQueryable<T> Find(Expression<Func<T, bool>> criteria);
} 
当数据源是sql server数据库时,它通过实体框架工作。但是,当服务在Ingres数据库上运行时,会出现问题,因为它的.NET数据提供程序或ODBC驱动程序不适用于LINQ表达式。以下是我发现的一些变通方法:

  • 对于EF:因为它不是免费的,而且系统团队也不想安装它,所以我不能使用它
  • 如图所示自定义Ingres EF提供程序。这很有趣,但我恐怕无法确定时间(下周之前!)
  • 通过使用规范模式隐藏LINQ表达式在我的服务中的用法。因此,在sql server规范实现中仍然使用LINQ,而在Ingres案例中使用ado.net
  • NHibernate.Linq。我对NHibernate知之甚少,但我猜它可能能够将LINQ表达式与Ingres连接起来

  • 请就方案2-4提出建议。非常感谢

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

    IQueryable<T> Query<T>();
    
    IQueryable查询();
    
    因此,应用层将能够调用它并链接它想要的任何内容,如:

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

    对于你的问题,我发现,当没有EF提供者时——或者你出于任何原因不能使用它时——NHibernate和流利的NHibernate是完全可以选择的。虽然不如EF(显然是代码优先)强大,但仍然是一个很好的后备方案。它支持最常见的linq操作符,它将非常适合您的抽象设计。

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

    IQueryable<T> Query<T>();
    
    IQueryable查询();
    
    因此,应用层将能够调用它并链接它想要的任何内容,如:

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

    对于你的问题,我发现,当没有EF提供者时——或者你出于任何原因不能使用它时——NHibernate和流利的NHibernate是完全可以选择的。虽然不如EF(显然是代码优先)强大,但仍然是一个很好的后备方案。它支持最常见的linq运算符,非常适合您的抽象设计。

    谢谢,Matteo。我喜欢Query()方法。泛型方法而不是类,不是吗?我会试试NHibernate,是的。您的存储库界面不应该是通用的。您可以在一个类中实现它,然后通过查询可以访问所有类型。谢谢,Matteo。我喜欢Query()方法。泛型方法而不是类,不是吗?我会试试NHibernate,是的。您的存储库界面不应该是通用的。您可以在一个类中实现它,然后通过查询可以访问所有类型。