我正在开发一个存储库模式,其中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需要它创建的类型的函数而不是我传入的函数。
答案 0 :(得分:1)
首先,您需要将Find
签名更改为:
T Find(Expression<Func<T, bool>> query);
LINQ to SQL需要将逻辑作为表达式树而不是普通委托,否则无法解决如何将其转换为SQL的问题。
除此之外,我担心它不是非常清楚 - 听起来你没有为你的存储库和LINQ to SQL使用相同的域类。是对的吗?这听起来像是一个潜在的问题;至少它会让生活变得非常棘手。