簡體   English   中英

LINQ 2實體:將int與字符串進行比較

[英]LINQ 2 Entities: compare int to string

我需要構造一個查詢以基於過濾器值返回單個實體。 它必須在服務器上執行,LINQ 2 Objects不是一個選項。

返回的實體類型,獲得它的屬性以及該屬性的值僅在運行時才知道,並且可以在運行時進行更改,因此我需要盡可能動態地執行此操作。 我覺得自己快要到了,但是最后一步一直讓我難以理解。 到目前為止,這是我嘗試過的方法:

模型包含過濾器數據

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轉換為字符串以進行比較,在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類型的參數。 因此,在將其傳遞給StringConvert方法之前,我需要能夠將propParam(整數)的值轉換為雙精度。 我將如何去做?

如果我只可以編寫查詢,則示例如下所示(可行):

var result = Repository.Query<Customer>().Where(x => SqlFunctions.StringConvert((double)x.Id) == Model.FilterValue);

也許只使用Dynamic LINQ來執行此操作,或者編寫原始SQL查詢會更容易,但是我想知道是否有一種我一直嘗試的解決方案。

您可以使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM