有些時候,我們需要將數據庫中某張表的列作爲參數,動態傳入到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();
}
執行結果