IQueryable<T>
对后备数据存储区执行查询(在本例中为sql RDBMS)。您的sql RDBMS不了解IEquatable<T>
*,并且不能使用其实现:查询函数必须可翻译为sql,并且obj.Equals(objectName)
不可翻译。
您可以转换IQueryable<T>
为IEnumerable<T>
并在内存中执行查询,但是这样效率太低。您应该将签名更改为Expression<Func<TSource, bool>>
谓词,然后将名称检查器传递给它:
public static T Read<T>(Expression<Func<T,bool>> pred) {
using (ISession session = NHibernateHelper.OpenSession()) {
return session.Query<T>().SingleOrdefault(pred);
}
}
现在,您可以按以下方式使用此方法:
Make snake = Read<Make>(x => x.Name == "snake");
*另外,IEquatable<T>
在显示的方法中未使用your :该Equals(string)
方法可以作为的实现IEquatable<string>
,但在您的Make
类实现的接口列表中未提及。