这个问题在 NHibernate 2 和 3 中都会出现。我有一个类 A,它有一个类 B 的成员集。直接查询类可以很好地执行。但是当我将涉及类 B 的表达式之一传递到方法中时,出现以下错误:
System.ArgumentException:“System.Linq.Expressions.ConstantExpression”类型的对象无法转换为“System.Linq.Expressions.LambdaExpression”类型。
据我所知,我将完全相同的表达式传递给 Any() 方法。但由于某种原因,他们受到不同的对待。我已经做了一些调试,看起来在第一个方法中,表达式被视为 NodeType 'Quote' 的表达式,而第二个方法中的相同表达式似乎被视为 NodeType 'Constant' 的表达式。第二个方法中的表达式的父表达式具有 NodeType 'MemberAccess'。所以看起来表达式树在不同的测试方法中是不同的。我只是不明白为什么以及如何解决这个问题。
涉及班级:
public class A
{
public virtual int Id { get; set; }
public virtual ISet<B> DataFields { get; set; }
}
public class B
{
public virtual int Id { get; set; }
}
示例测试代码:
[TestMethod]
public void TestMethod1()
{
using (ISession session = sessionFactory.OpenSession())
{
var records = session.Query<A>()
.Where<A>(a => a.DataFields
.Any(b => b.Id == 1));
Console.Write("Number of records is {0}", records.Count());
}
}
[TestMethod]
public void TestMethod2()
{
GetAsWhereB(b => b.Id == 1);
}
private void GetAsWhereB(Func<B, bool> where)
{
using (ISession session = sessionFactory.OpenSession())
{
var records = session.Query<A>()
.Where(a => a.DataFields
.Any(where));
Console.Write("Number of records is {0}", records.Count());
}
}
这是一个问题:
private void GetAsWhereB(Func<B, bool> where)
这需要一个delegate- 你想要一个表达式树否则NHibernate无法介入。尝试这个:
private void GetAsWhereB(Expression<Func<B, bool>> where)
顺便说一句,由于使用了空格,您的查询很难阅读。我建议而不是:
var records = session.Query<A>().Where<A>(a => a.DataFields.
Any(b => b.Id == 1));
您明确表示“Any”调用是在 DataFields 上进行的:
var records = session.Query<A>().Where<A>(a => a.DataFields
.Any(b => b.Id == 1));
我还建议您将参数名称从“where”更改为“whereExpression”或“predicate”之类的名称。无论如何,某种名词:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)