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 查询会更容易,但我想知道是否有我首先尝试的解决方案。
您可以使用
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);