给定此方法:
internal static IEnumerable<Entity> GetByParentImpl<Entity, TKey>(this ICanGetByParent<Entity, TKey> self, TKey parentId, string fieldName)
where Entity : class
{
RepositoryBase<Entity> rb = (RepositoryBase<Entity>)self;
rb.unitOfWork.Begin();
var entities = rb.unitOfWork.Session.QueryOver<Entity>()
.Where(e => EqualityComparer<TKey>.Default.Equals(GetId<Entity, TKey>(e, fieldName), parentId))
.List();
return entities;
}
而这个助手:
private static TKey GetId<Entity, TKey>(object obj, string fieldName) where Entity : class
{
TKey id = default(TKey);
switch(id.GetType().Name) {
case "Int32":
break;
case "Guid":
id = (TKey)TypeDescriptor.GetConverter(typeof(TKey)).ConvertFromInvariantString((string)typeof(Entity).GetField(fieldName).GetValue(obj));
break;
}
return id;
}
我在 linq 语句上收到此异常:
无法识别的方法调用: System.Collections.Generic.EqualityComparer'1[[System.Guid, mscorlib, 版本=4.0.0.0,区域性=中性, PublicKeyToken=b77a5c561934e089]]:Boolean Equals(System.Guid, 系统指导)
这是什么意思?我什至不确定如何正确调试它。我可以发誓上面的代码正在工作......
您不能以这种方式将 linq 与任何数据库提供程序进行比较。提供程序无法将其转换为表达式树。所以你必须在.ToArray() 或者给一个 Expression<Func<RegisterCardBase, bool>>
where 而不是 lambda。
PS:你为什么要对吉德做这么奇怪的动作?它是如何存储在数据库中的?
NHibernate 的 Linq 提供程序尝试将 Linq 查询转换为 HQL,并最终转换为 SQL。默认情况下,在 NHibernate 中不支持 Where 方法中的 lambda 表达式。
但是,NHibernate Linq 提供程序是可扩展的。您可以创建自己的扩展来处理各种不受支持的表达式。
Alessandro Giorgetti有一个很好的示例,介绍如何扩展Linq提供程序以支持String.Equals
StringComparison
选项。
编辑
我刚刚意识到你使用的是QueryOver,而不是NHibernate Linq。您可能应该删除 linq 标记。如果您切换到session.Query<Entity>()
,我的答案有些相关.不过,您可能会重新考虑转换Id
的方法并在Where
中使用它。