簡體   English   中英

如何動態構建Linq查詢

[英]How to build a Linq Query Dynamically

我看到了一些舊帖子,但無法弄清楚如何實現這一點,請提供示例。

我在DataTable上運行查詢以對所有列進行分組。 數字列將僅稱為運行時,因此我需要動態構建查詢。

var newGroup = from row in dataTable.AsEnumerable() 
group row by new { ID = row.Field<string>("column1"), group1 = row.Field<string>("column2") };

我需要為n number of columns動態構建以上查詢。

請解釋如何通過遍歷列列表並構建Lambda表達式來構建ParameterExpression。

簡而言之:如何實現此目標有不同的方法。 困難的方法是通過使用表達式來構建Func和謂詞的組合。 更簡單的方法是利用庫-下文提到的LINQ Dynamic Query Library

解決方案#1:這是一個很好的起點- 在C#中的運行時構建LINQ查詢

解決方案2:您還應該能夠使用Linq Dynamic Query來實現此目的,因為它是為此目的而構建的- 動態LINQ(第1部分:使用LINQ動態查詢庫)

我已經多次看到這個問題,所以我決定創建一個博客,而不是操縱來自C#的數據。 我已經利用動態SQL在SQL數據庫級別上完成了很多工作。

這是鏈接 希望這可以幫助。

我遇到一種情況,我需要為查詢的左側和右側動態生成LINQ查詢。 所以換句話說,Where(“ some property == some value”)。 我在LINQPad的團隊中與PredicateBuilder一起玩耍,並嘗試了其他一些方法,但最后LINQ動態查詢庫(System.Linq.Dynamic)使此任務非常簡單。

在不進行所有詳細介紹的情況下,我所擁有的是一種方法,該方法采用參數來對MVC頁面上的jqGrid上的項目進行過濾和排序。 名為QueryOptions的對象擁有各種查詢設置。 Data.ImportDataSearchView是綁定到后端數據庫視圖的Entity Framework實體。

過濾器表達式是通過調用以下命令構建的:

        options.FilterExpression += filterList.BuildFilterExpression<Data.ImportDataSearchView>();

BuildFilterExpression的一部分如下:

    public string BuildFilterExpression<T>()
    {
        var type = typeof(T);
        var exp = string.Empty;

        foreach (Filter filter in this)
        {
            var typeName = filter.DataType.ToLower();

            // Skip if no values
            if (!filter.Values.Any())
                continue;

            switch (typeName)
            {
                case "string":
                    // html decode string and escape single quotes
                    var stringVal = System.Web.HttpUtility.HtmlDecode(filter.Values[0]);
                    stringVal = stringVal.Replace("'", "''");

                    if (filter.Operator == Enums.FilterOperator.CONTAINS)
                        exp += string.Format("{0}.Trim().ToLower().Contains(\"{1}\")", filter.Attribute, stringVal.Trim().ToLower());

                    else if (filter.Operator == Enums.FilterOperator.DOES_NOT_EQUAL)
                        exp += string.Format("!{0}.ToLower().Equals(\"{1}\")", filter.Attribute, stringVal.ToLower());

                    else if (filter.Operator == Enums.FilterOperator.DOES_NOT_CONTAIN)
                        exp += string.Format("!{0}.Trim().ToLower().Contains(\"{1}\")", filter.Attribute, stringVal.Trim().ToLower());

                    else if (filter.Operator == Enums.FilterOperator.ENDS_WITH)
                        exp += string.Format("{0}.Trim().ToLower().EndsWith(\"{1}\")", filter.Attribute, stringVal.Trim().ToLower());

                    else if (filter.Operator == Enums.FilterOperator.EQUALS)
                        exp += string.Format("{0}.ToLower().Equals(\"{1}\")", filter.Attribute, stringVal.ToLower());

                    else if (filter.Operator == Enums.FilterOperator.STARTS_WITH)
                        exp += string.Format("{0}.Trim().ToLower().StartsWith(\"{1}\")", filter.Attribute, stringVal.Trim().ToLower());

                    break;

                //case "select": -- for dropdowns
                //case "datetime": -- for dates, etc. etc.

            // add spaces around expression
            exp = string.Format(" {0} ", exp);

            // add and/or to expression
            if (this.IndexOf(filter) != this.Count() - 1)
                exp += string.Format(" {0} ", ExpressionType.ToLower() == "and" ? "&&" : "||");
        }

        return exp;
    }

然后,在構建了表達式字符串之后,按以下方式檢索數據:

        options.OrderBy = string.IsNullOrEmpty(sortIndex) ? "TrackingId asc" : string.Format(" {0} {1} ", sortIndex, sortOrder);

        var db = new Data.BmpDB();
        var list = string.IsNullOrEmpty(options.FilterExpression)
            ? db.ImportDataSearchViews.OrderBy(options.OrderBy).ToList()
            : db.ImportDataSearchViews.Where(options.FilterExpression).OrderBy(options.OrderBy).ToList();

下面的options.FilterExpression字符串是通過BuildFilterExpression方法將三個搜索條件字段拼湊成LINQ where子句的漂亮,簡單謂詞字符串的示例:

“ BmpName.Trim()。ToLower()。包含(\\” crops \\“)&& DataProviderId.ToLower()。Equals(\\” 123 \\“)&& StatusId == 1”

暫無
暫無

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

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