通用存储库Linq2Sql阻抗不匹配问题

时间:2009-08-22 17:34:39

标签: c# linq linq-to-sql repository-pattern expression-trees

我正在开发一个存储库模式,其中API如下所示:

var visitor = repository.Find(x => x.EmailAddress == credentials.EmailAddress &&
                              x.Password == credentials.Password);

其中visitor是域对象,x表示此域对象。存储库上Find方法的方法签名是:

T Find(Func<T, bool> query);

这一切都很精彩,直到我尝试将它与Linq2Sql一起使用,因为linq2sql创建了自己的对象,因此当我想调用它时:

context.visitors.FirstOrDefault(query); 

存在类型不匹配,因为linq2sql需要它创建的类型的函数而不是我传入的函数。

1 个答案:

答案 0 :(得分:1)

首先,您需要将Find签名更改为:

T Find(Expression<Func<T, bool>> query);

LINQ to SQL需要将逻辑作为表达式树而不是普通委托,否则无法解决如何将其转换为SQL的问题。

除此之外,我担心它不是非常清楚 - 听起来你没有为你的存储库和LINQ to SQL使用相同的域类。是对的吗?这听起来像是一个潜在的问题;至少它会让生活变得非常棘手。