Как построить динамическое предложение где со строковым аргументом - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь создать метод, чтобы добавить предложение where в запрос linqToSQL (вернуть iquerable).Я пробую несколько методов, но всегда использую TOString, Indexof ... но этот результат - запрос sql, берущий все элементы и фильтр, созданный в linq.Я вижу запрос в провайдере SQL сервера.Я хочу, чтобы метод, чтобы сделать это с результатом, это SQL-запрос, где включить внутри

Я работаю на VisualStudio 2017 с SQL Server 2016. Я код в vb.net

Я вижу интересную вещьв динамическая библиотека linq .Но я не могу приспособиться к моей ситуации

 <Extension()> _
    Public Function Where(ByVal source As IQueryable, ByVal predicate As String, ByVal ParamArray values() As Object) As IQueryable
        If source Is Nothing Then Throw New ArgumentNullException("source")
        If predicate Is Nothing Then Throw New ArgumentNullException("predicate")
        Dim lambda As LambdaExpression = DynamicExpression.ParseLambda(source.ElementType, GetType(Boolean), predicate, values)
        Return source.Provider.CreateQuery( _
            Expression.Call( _
                GetType(Queryable), "Where", _
                New Type() {source.ElementType}, _
                source.Expression, Expression.Quote(lambda)))
    End Function

Но мне не нужен весь этот сложный состав.Уже несколько лет я покупаю свои коммунальные услуги.Но нужно обновить его.Вот мой код моих утилит

<Extension()>
Public Function Where(ByVal source As IQueryable, ByVal predicate As String) As IQueryable
    Dim param = Expression.Parameter(GetType(String), "x")
    Return source.Provider.CreateQuery(
            Expression.Call(
                GetType(Queryable), "Where",
                New Type() {source.ElementType},
                source.Expression, Expression.Quote(Expression.Lambda(Expression.Constant(predicate), param))))
End Function


Public Function TFOAppliqueFiltreTri(Of T, MaClassDatas As Class)(Origins As IQueryable(Of T), ByVal MesDonnees As TableFullOption.PagerTabEnCours(Of MaClassDatas)) As iqueriable(of T)
    Dim retour As New TableFullOption.LstRetour

    'Colonne de filtre
    Dim strWh As String = ""
    Dim Filtredrecords As IQueryable(Of T)
    For Each Sort In MesDonnees.MesOptions

                Dim colName = Sort.ColName
                If strWh.Length > 0 Then strWh = strWh & " AND "
                strWh = strWh & String.Format(colName & " like '%{0}%'", Sort.Search)

    Next
    If strWh.Length > 0 Then
        Filtredrecords = Origins.Where(strWh) '<- Here call Where
    Else
        Filtredrecords = Origins
    End If



    Return Filtredrecords 
End Function

Я имею ошибку: Aucune метод générique 'Где' тип файла 'System.Linq.Queryable' n'est совместимый все аргументы типа и аргументы типа '' '' ''Тогда моя проблема - правильно написать лямбда-выражение.Мой предикатный аргумент таков: Столбец1 как "% aaa%".Я хочу переписать, где метод dynamicLinq принимает строковый аргумент: Column1, как '% aaa%' direcxtly

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 06 февраля 2019

Наконец, после большого количества чтения в Google и немного чувств и, конечно, много шансов.

 Public Function Where(Of TEntity)(source As IQueryable(Of TEntity), searchColumn As List(Of String), searchValue As String) As IQueryable(Of TEntity)
    Dim cond As Expression = Nothing
    Dim ParamExpr = Expression.Parameter(GetType(TEntity), "x")
    Dim conCat2 = GetType(String).GetMethod("Concat", New Type() {GetType(String), GetType(String)})
    Dim conCat4 = GetType(String).GetMethod("Concat", New Type() {GetType(String), GetType(String), GetType(String), GetType(String)})
    Dim Delim = Expression.Constant("/")
    Dim DateName = GetType(SqlFunctions).GetMethod("DateName", New Type() {GetType(String), GetType(Nullable(Of DateTime))})
    Dim DatePart = GetType(SqlFunctions).GetMethod("DatePart", New Type() {GetType(String), GetType(Nullable(Of DateTime))})
    Dim DblToString = GetType(SqlFunctions).GetMethod("StringConvert", New Type() {GetType(Nullable(Of Double))})

    For Each cn In searchColumn
        For Each colName In cn.Split("|")
            If Not colName.estVide Then
                Dim body As Expression = ParamExpr
                For Each member In colName.Split(".")
                    body = Expression.PropertyOrField(body, member)
                Next
                Dim Tostr As Expression
                If body.Type.FullName.Contains("String") Then
                    Tostr = body
                ElseIf body.Type.FullName.Contains("DateTime") Then
                    Dim day = Expression.Call(Expression.Call(conCat2, Expression.Constant("0"), Expression.Call(DateName, Expression.Constant("day"), body)), "Substring", Nothing, Expression.Constant(0), Expression.Constant(2))
                    Dim Month = Expression.Call(DatePart, Expression.Constant("MM"), body)
                    Dim toDouble = Expression.Convert(Month, GetType(Nullable(Of Double)))
                    Dim mois = Expression.Call(conCat2, Expression.Constant("0"), Expression.Call(Expression.Call(DblToString, toDouble), "Trim", Nothing))
                    Dim an = Expression.Call(DateName, Expression.Constant("year"), body)
                    Tostr = Expression.Call(conCat2, Expression.Call(conCat4, day, Delim, mois, Delim), an)
                Else
                    Tostr = Expression.Call(body, "Convert.ToString", Nothing)
                    'Tostr = Expression.Convert(body, GetType(String))
                End If
                Dim condPart = Expression.Call(Expression.Call(Tostr, "ToLower", Nothing), "Contains", Nothing, Expression.Call(Expression.Constant(searchValue), "ToLower", Nothing))
                If cond Is Nothing Then
                    cond = condPart
                Else
                    cond = Expression.OrElse(cond, condPart)
                End If
            End If
        Next
    Next
    Return source.Provider.CreateQuery(Of TEntity)(Expression.Call(GetType(Queryable), "Where", New Type() {GetType(TEntity)}, source.Expression, Expression.Lambda(cond, ParamExpr)))
End Function

Теперь у меня есть динамический фильтр, который сгенерировал запрос SQL с полным предложением, где

...