我需要構建一個查詢來返回基於過濾器值的單個實體。它必須在服務器上執行,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查詢,但我想知道是否有一種解決方案是我首先嚐試的方式。
好了,現在我只覺得自己很蠢-_- 非常感謝史蒂夫,就像一個魅力現在:) –