我正在使用NHibernate 3.1.0,並試圖通過使用BaseHqlGeneratorForMethod
和擴展DefaultLinqToHqlGeneratorsRegistry
來擴展LINQ提供程序,如Fabio's post中所述。將LINQ擴展爲Nhibernate提供程序,並結合動態LINQ問題
例如,要支持ToString()
我創建瞭如下的ToStringGenerator
。
internal class ToStringGenerator : BaseHqlGeneratorForMethod
{
public ToStringGenerator()
{
SupportedMethods = new[]
{
ReflectionHelper.GetMethodDefinition<object>(x => x.ToString())
};
}
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
return treeBuilder.Cast(visitor.Visit(targetObject).AsExpression(), typeof(string));
}
}
和我一直在使用
internal class CustomLinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
{
public CustomLinqToHqlGeneratorsRegistry()
{
this.Merge(new ToStringGenerator());
}
}
等。到目前爲止,這個工程的「靜態」查詢,我可以用它像這樣註冊:
var results = mSession.Query<Project>();
string pId = "1";
results = results.Where(p => p.Id.ToString().Contains(pId));
這正確地轉換到其SQL對應(使用SQL Server 2008)
where cast(project0_.Id as NVARCHAR(255)) like (''%''[email protected]+''%'')
問題出現時,我嘗試與微軟動態的LINQ庫(在this Scott Guthrie's post討論)組合使用這樣的:
var results = mSession.Query<Project>();
string pId = "1";
results = results.Where("Id.ToString().Contains(@0)", pId);
這導致NotSupportedException異常與「System.String的ToString消息()「(這與我在實現上述類之前獲得的靜態查詢完全相同)。此異常正在拋出,其源代碼爲「NHibernate」,而StackTrace的「」位於NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitMethodCallExpression(MethodCallExpression expression)「。
那麼我在這裏錯過了什麼?我做錯了什麼,或者需要做些什麼來支持這種情況?
這聽起來像是合併實現中的一個錯誤。 – murki 2014-12-09 02:28:04