鉴于此方法:
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, 的System.Guid)
这是什么意思?我甚至不确定如何正确调试。我本可以发誓上面的代码正在运行......
答案 0 :(得分:3)
您不能以这种方式对任何数据库提供程序进行linq比较。 Provider无法将其转换为表达式树。因此,您必须在.ToArray()之后使用它,或者将Expression<Func<RegisterCardBase, bool>>
放入Where而不是lambda。
答案 1 :(得分:2)
NHibernate的Linq提供程序尝试将Linq查询转换为HQL,最终转换为SQL。 NHibernate中默认不支持您在Where方法中使用的lambda表达式。
但是,NHibernate Linq提供程序是extensible。您可以create使用自己的extensions来处理各种不受支持的表达式。
Alessandro Giorgetti就如何扩展Linq提供商以支持String.Equals
with StringComparison
option提供了很好的示例。
修改强>
我刚刚意识到你使用的是QueryOver,而不是NHibernate Linq。您应该删除linq标记。如果你切换到session.Query<Entity>()
,我的答案有些相关。不过,您可能会重新考虑转换Id
并在Where
中使用它的方法。