Linq可查询表达式树:SqlException:在'&';

Linq可查询表达式树:SqlException:在'&';,linq,tree,expression,Linq,Tree,Expression,我收到一个错误:{SqlException:error syntax near'&},我似乎无法理解。我有一个课堂提问结果(见下文) 我希望通过QuestionId和Result进行过滤,例如{QuestionId==48&&Result>=24}。问题似乎与使用Expression.And有关。我在没有使用它的情况下尝试了这个测试,只使用了其中一个条件,它运行得很好。我以前使用过表达式,而且它很有效 public static List<int> GetIdList() {

我收到一个错误:{SqlException:error syntax near'&},我似乎无法理解。我有一个课堂提问结果(见下文)

我希望通过QuestionId和Result进行过滤,例如{QuestionId==48&&Result>=24}。问题似乎与使用Expression.And有关。我在没有使用它的情况下尝试了这个测试,只使用了其中一个条件,它运行得很好。我以前使用过表达式,而且它很有效

public static List<int> GetIdList()
{ 
    IQueryable<QuestionResult> questionResultList = _context.QuestionResult.AsQueryable();
    var questionResult = Expression.Parameter(typeof(QuestionResult), "qr");
    MemberExpression questionId = Expression.Property(questionResult, "QuestionId");
    MemberExpression result = Expression.Property(questionResult, "Result");
    var conditionA = Expression.Equal(questionId, Expression.Constant(48));
    var conditionB = Expression.GreaterThanOrEqual(result, Expression.Convert(Expression.Constant(24), result.Type));
    var and = Expression.And(conditionA, conditionB);
    var predicateBody = Expression.Lambda<Func<QuestionResult, bool>>(and, questionResult);

    MethodCallExpression query = Expression.Call(
        typeof(Queryable),
        "Where",
        new Type[] { questionResultList.ElementType },
        questionResultList.Expression,
        predicateBody
    );
    var questionResultIdList = questionResultList.Provider.CreateQuery<QuestionResult>(query).Select(i => i.Id).ToList();

    return questionResultIdList;
}
公共静态列表GetIdList()
{ 
IQueryable questionResultList=_context.QuestionResult.AsQueryable();
var questionResult=表达式参数(typeof(questionResult),“qr”);
MemberExpression questionId=Expression.Property(questionResult,“questionId”);
MemberExpression结果=Expression.Property(questionResult,“结果”);
var conditionA=表达式.Equal(问题ID,表达式.Constant(48));
var conditionB=Expression.GreaterThanOrEqual(result,Expression.Convert(Expression.Constant(24),result.Type));
var和=表达式和(条件a,条件b);
var predicateBody=Expression.Lambda(and,questionResult);
MethodCallExpression query=Expression.Call(
类型(可查询),
“哪里”,
新类型[]{questionResultList.ElementType},
问题结果列表。表达式,
谓词库
);
var questionResultList=questionResultList.Provider.CreateQuery(查询).Select(i=>i.Id).ToList();
返回问题列表;
}
你能看出我在什么地方出了问题吗?在查询运行之前对其进行调试显示:

{value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[SurveyV3.Models.DatabaseModels.QuestionResult])。其中(qr=>((qr.QuestionId==48)和(qr.Result>=Convert(24))}

在我看来这是正确的。我一直在使用此处和此Microsoft页面上的问题寻求帮助

谢谢,Oj

var和=表达式和(条件a,条件b)

表达式。And
执行按位And运算


您需要执行逻辑AND运算的
Expression.AndAlso

不确定这是解决方案,但我会使用
Expression.AndAlso
(逻辑比较)而不是
Expression.AND
(按位比较)。我认为EF不喜欢按位比较。是的,非常感谢,这就是问题所在。为什么要手动创建表达式树来执行此操作?IQueryable API正是为了这个目的而存在的,因此您可以避免手动创建表达式树。我强烈建议您不要使用这种方法,除非您必须这样做,因为它确实会损害代码的可维护性。我的实现版本将执行更多的动态函数,例如在循环中使用所有数字运算符和一些字符串操作,因此在结束查询中会有许多表达式,如((qr.QuestionId==48)和(qr.Result>=Convert(24)))组合在一起。
public static List<int> GetIdList()
{ 
    IQueryable<QuestionResult> questionResultList = _context.QuestionResult.AsQueryable();
    var questionResult = Expression.Parameter(typeof(QuestionResult), "qr");
    MemberExpression questionId = Expression.Property(questionResult, "QuestionId");
    MemberExpression result = Expression.Property(questionResult, "Result");
    var conditionA = Expression.Equal(questionId, Expression.Constant(48));
    var conditionB = Expression.GreaterThanOrEqual(result, Expression.Convert(Expression.Constant(24), result.Type));
    var and = Expression.And(conditionA, conditionB);
    var predicateBody = Expression.Lambda<Func<QuestionResult, bool>>(and, questionResult);

    MethodCallExpression query = Expression.Call(
        typeof(Queryable),
        "Where",
        new Type[] { questionResultList.ElementType },
        questionResultList.Expression,
        predicateBody
    );
    var questionResultIdList = questionResultList.Provider.CreateQuery<QuestionResult>(query).Select(i => i.Id).ToList();

    return questionResultIdList;
}