LINQ 2 实体:将 int 与字符串进行比较

本文关键字:字符串 比较 int 实体 LINQ | 更新日期: 2023-09-27 18:33:22

我需要构造一个查询以根据过滤器值返回单个实体。它必须在服务器上执行,LINQ 2 对象不是一个选项。

要返回的实体类型、获取它的属性以及该属性的值都仅在运行时已知,并且可以在运行时更改,因此我需要尽可能动态地执行此操作。我觉得我快到了,但最后一步一直躲着我。这是我到目前为止尝试过的:

模型包含筛选器数据

propParam 将始终为 int 类型

属性模型将始终为字符串类型

我无法更改这些类型,因为这只是众多过滤之一 方案(查找(。

private void SetFilter(Type typeToLookUp, string filterPropertyName)
{
    var propParam = typeToLookUp.GetProperty(filterPropertyName);
    var propModel = Model.GetType().GetProperty("FilterValue");
    var param = Expression.Parameter(typeToLookUp, "x");
    var bodyLeft = Expression.Property(param, propParam);
    var bodyRight = Expression.Property(Expression.Constant(Model), propModel);
    var body = Expression.Equal(bodyLeft, bodyRight);
    ...
}

这当然失败了,因为我试图将 int(左(与字符串(右(进行比较。

所以我需要将 int 转换为字符串以便能够比较它,在 LINQ 2 实体 SqlFunctions.StringConvert 中使用:

private void SetFilter(Type typeToLookUp, string filterPropertyName)
{
    var propParam = typeToLookUp.GetProperty(filterPropertyName);
    var propModel = Model.GetType().GetProperty("FilterValue");
    var stringConvertMethod = typeof(SqlFunctions).GetMethods(BindingFlags.Public | BindingFlags.Static)
                                .Single(
                                    x =>
                                    x.Name == "StringConvert" && x.GetParameters().Count() == 1 &&
                                    x.GetParameters()[0].ParameterType == typeof(double?));
    var param = Expression.Parameter(typeToLookUp, "x");
    var bodyLeft = Expression.Call(stringConvertMethod, Expression.Property(param, propParam));
    ...
}

当然,此方法调用将失败,因为 StringConvert 不采用 int 类型的参数。因此,在将 propParam(整数(的值传递给 StringConvert 方法之前,我需要能够将 propParam 的值转换为双倍。我该怎么做呢?

例如,如果我能编写查询,它将如下所示(这有效(:

var result = Repository.Query<Customer>().Where(x => SqlFunctions.StringConvert((double)x.Id) == Model.FilterValue);

也许只使用动态 LINQ 来执行此操作或编写原始 SQL 查询会更容易,但我想知道是否有我首先尝试的解决方案。

LINQ 2 实体:将 int 与字符串进行比较

您可以使用

Expression.Convert将表达式中的int转换为double

var param = Expression.Parameter(typeToLookUp, "x");
var property = Expression.Property(param, propParam);  
var doubleValue = Expression.Convert(property, typeof(double));
var bodyLeft = Expression.Call(stringConvertMethod, doubleValue);