我有一个包含多个字段的表单(公司名称,邮政编码等),允许用户搜索数据库中的公司.如果用户在多个字段中输入值,那么我需要搜索所有这些字段.我正在使用LINQ来查询数据库.
到目前为止,我已经设法编写了一个函数,它将查看它们的输入并将其转换为表达式列表.我现在想将该List转换为单个表达式,然后我可以通过LINQ提供程序执行该表达式.
我最初的尝试如下
private Expression<Func<Company, bool>> Combine(IList<Expression<Func<Company, bool>>> expressions)
{
if (expressions.Count == 0)
{
return null;
}
if (expressions.Count == 1)
{
return expressions[0];
}
Expression<Func<Company, bool>> combined = expressions[0];
expressions.Skip(1).ToList().ForEach(expr => combined = Expression.And(combined, expr));
return combined;
}
Run Code Online (Sandbox Code Playgroud)
但是,这会失败,并出现"二进制运算符并且未定义..."的异常消息.有没有人有任何想法,我需要做什么来结合这些表达式?
编辑:更正了我忘记将结果和表达式一起分配给变量的行.谢谢你指出那些人.
我在形成动态查询表达式期间处理Nullable类型的scanario.这些表达式将从任何SQL表中获取过滤数据(使用EF与Code First类连接).
我有正常的对象(例如,托运操作几个属性以及Nullable属性).
我的表达形式很顺利,直到我遇到一些Nullable类型.在这些无用之处,我得到了
没有为类型'System.Nullable`1 [System.Single]'和'System.Single'定义二元运算符NotEqual.
为了删除此异常,我正在使用关于在不同线程上发布的转换的所有appraoches.
这些都是生成带有"Convert"字样的表达式(即Convert(someValue)),结果我总是有表达式
t=>(t.Consignment.Id = 45000 && t.Consignment.someProperty>=45 Or t.Consignment.Weight! = Convert(5000)).
Run Code Online (Sandbox Code Playgroud)
当然我需要整个上面的表达式没有"转换".因为这个"转换"不会相应地从表中获取数据.
任何帮助将不胜感激!还应该做什么?我已经知道转换,但是这使得整个表达式无用,因为它不会因为不必要的"转换"而投影记录
添加
Expression NotEqual<T>(Expression PropertyType, ConstantExpression a_Constant, ParameterExpression parameter)
{
if(IsNullableType(Property.Type) &&!IsNullableType(a_Constant.Type))
{
var converted = a_Constant.Type != Property.Type ? (Expression)Expression.Convert(a_Constant, Property.Type): (Expression)a_Constant;
// here above statement returns (Convert(50000)) and all I want (50000), but i tried all combinitions from Expression in order to form this constant as expression, it always throws exception what I mentioned originally.
var body = …Run Code Online (Sandbox Code Playgroud)