我正在开发一个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表达式一起使用。以下是我发现的一些解决方法:
请对选项2 - 4提出建议。非常感谢!
答案 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运算符,它完全适合您的抽象设计。