2013-09-30 34 views
0

我需要构建一个查询来返回基于过滤器值的单个实体。它必须在服务器上执行,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查询,但我想知道是否有一种解决方案是我首先尝试的方式。

回答

1

您可以通过使用Expression.Convertint在表达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); 
+0

好了,现在我只觉得自己很蠢-_- 非常感谢史蒂夫,就像一个魅力现在:) –