gpt4 book ai didi

linq - 将表达式传递给 NHibernate 中的方法会导致类型 'ConstantExpression' 的对象无法转换为类型 'LambdaExpression'

转载 作者:行者123 更新时间:2023-12-02 01:20:53 25 4
gpt4 key购买 nike

这个问题在 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”之类的名称。无论如何,某种名词:)

关于linq - 将表达式传递给 NHibernate 中的方法会导致类型 'ConstantExpression' 的对象无法转换为类型 'LambdaExpression',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4738170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com