【问题标题】:LINQ 2 Entities: compare int to stringLINQ 2 实体:将 int 与字符串进行比较
【发布时间】:2013-09-30 10:50:25
【问题描述】:

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

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

模型包含过滤器数据

propParam 将始终是 int

类型

propModel 将始终是 string

类型

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

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 Entities 中使用了 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 方法之前,我需要能够将其转换为 double。 我该怎么做呢?

例如,如果我可以编写查询,它会如下所示(可行):

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

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

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    您可以使用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);
    

    【讨论】:

    • 好的,现在我只是觉得自己很愚蠢 -_- 非常感谢史蒂夫,现在就像一个魅力 :)
    猜你喜欢
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2016-03-24
    相关资源
    最近更新 更多