我需要构建一个查询来返回基于过滤器值的单个实体。它必须在服务器上执行,LINQ 2 Objects不是一个选项。LINQ 2实体:比较诠释到字符串
要返回的实体的类型,获取它的属性以及该属性的值只在运行时才知道,并且可以在运行时更改,所以我需要尽可能动态地执行此操作。 我觉得我快要到了,但最后一步仍在逃避我。 这是我到目前为止已经试过:
模式 containts过滤数据
propParam将永远是类型INT
propModel将永远是类型字符串
我无法更改这些类型,因为这只是许多筛选方案(查找)中的一种。
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转换为字符串能够为2个实体进行比较,在LINQ 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” t取一个int类型的参数。 所以我需要能够将propParam(一个整数)的值转换为double,然后再将其传递给StringConvert方法。 我该怎么做呢?
如果我能编写查询它看起来像这样的例子(这个工程):
var result = Repository.Query<Customer>().Where(x => SqlFunctions.StringConvert((double)x.Id) == Model.FilterValue);
也许会更容易只使用动态LINQ要做到这一点,或者写一个原始的SQL查询,但我想知道是否有一种解决方案是我首先尝试的方式。
好了,现在我只觉得自己很蠢-_- 非常感谢史蒂夫,就像一个魅力现在:) –