2013-09-30 31 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

好了,現在我只覺得自己很蠢-_- 非常感謝史蒂夫,就像一個魅力現在:) –