Linq動態傳遞數據庫中某張表的列

有些時候,我們需要將數據庫中某張表的列作爲參數,動態傳入到linq中,但是在linq查詢語句中並沒有這樣的功能,這個時候我們會很煩惱。接下來我將通過一下的例子來總結一下有關linq動態傳遞參數的問題

 

首先我們要引用命名空間

using System.Linq.Expressions;

我們的目標是動態傳遞參數,此時我們需要用到的ParameterExpression,用它來定義我們所需要的類型及相應的名稱

如ParameterExpression para = Expression.Parameter(typeof(Categories), "c");

由於動態傳遞的參數可能會很多此時我們需要如下操作

List<ParameterExpression> paras = new List<ParameterExpression>();
List<Expression> expression = new List<Expression>();

foreach (var c in conditons)
    {
         Expression left = Expression.Property(para, typeof(Categories).GetProperty(c.Key));//這裏獲取的是列,所以我們需要通過反射獲取數據表中的列
         Expression right = Expression.Constant(c.Value);//(創建關聯)獲取相應字段的值
         Expression ex = Expression.Equal(left, right);//放在一個對等條件中

         if (expression.Any())
              expression[0] = Expression.AndAlso(expression[0], ex);//這樣做的目的是:當傳入的列有多個時,需要在生成的SQL後面拼接,
         else
              expression.Add(ex);
    }
paras.Add(para);
var conditional = Expression.Lambda<Func<Categories, bool>>(expression[0], paras.ToArray());//設置where字句的表達式
cata = cata.Where(conditional);

具體實現如下

我使用的是linq to entity來加載數據的

public partial class 動態傳參
    {
        NorthwindEntities context;
        public 動態傳參()
        {
            context = new NorthwindEntities();
        }

        public List<Categories> getCategory()
        {
           
            List<Categories> categoryList=new List<Categories>();
            var data = from c in context.Categories
                           select c;
            if (data != null)
            {
                foreach (var d in data)
                {
                    Categories category = new Categories();
                    category.類別編號 = d.類別編號;
                    category.類別名稱 = d.類別名稱;
                    category.說明 = d.說明;
                    category.圖片 = d.圖片;

                    categoryList.Add(category);
                }
            }
            return categoryList;
        }


        public List<Categories> getCatagoryByConditions(Dictionary<string, string> conditons)
        {
            List<Categories> catagoryList = new List<Categories>();
            ParameterExpression para = Expression.Parameter(typeof(Categories), "c");


            var cata = from p in context.Categories
                       select p;

            if (conditons.Any())
            {
                List<ParameterExpression> paras = new List<ParameterExpression>();
                List<Expression> expression = new List<Expression>();

                foreach (var c in conditons)
                {
                    Expression left = Expression.Property(para, typeof(Categories).GetProperty(c.Key));
                    Expression right = Expression.Constant(c.Value);
                    Expression ex = Expression.Equal(left, right);

                    if (expression.Any())
                        expression[0] = Expression.AndAlso(expression[0], ex);
                    else
                        expression.Add(ex);
                }

                paras.Add(para);
                var conditional = Expression.Lambda<Func<Categories, bool>>(expression[0], paras.ToArray());
                cata = cata.Where(conditional);
            }

            //var selector2 = Expression.Lambda<Func<Categories, int>>(Expression.Property(para,), para);
            var memberList = cata.Select((group) => new
                {
                    group.類別編號,
                    group.類別名稱,
                    group.說明,
                    group.圖片
                });


            if (memberList != null)
            {
                foreach (var d in memberList)
                {
                    Categories category = new Categories();
                    category.類別編號 = d.類別編號;
                    category.類別名稱 = d.類別名稱;
                    category.說明 = d.說明;
                    category.圖片 = d.圖片;

                    catagoryList.Add(category);
                }
            }
            return catagoryList;
        }
頁面調用

if (!IsPostBack)
            {
                動態傳參 d = new 動態傳參();

                Dictionary<string, string> condions = new Dictionary<string, string>();
                int i = 1;
                condions.Add("類別名稱", "點心");
                condions.Add("說明", "甜點心,糖果,甜麪包");
                List<Categories> catagoryList = d.getCatagoryByConditions(condions);
                GridView1.DataSource = catagoryList;
                GridView1.DataBind();
            }

執行結果




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章