PDA

View Full Version : ایجاد دستورات linq بصورت Runtime



z.gitaro
چهارشنبه 14 خرداد 1393, 15:19 عصر
با سلام

فرض کنیم دستور لینک به صورت زیر نوشته شده است
var query = db.AccDocument.Join(db.AccDocumentItem, ad => ad.AccDocumentID, adi => adi.AccDocumentId, (ad, adi) => adi)
.Join(db.AccAccount, adi => adi.AccAccountId, aa => aa.AccAccountID, (adi, aa) => new {ACCdi=adi,ACCa=aa })
.Select(result => new RptBalanceRm
{
Credit = result.ACCdi.Credit,
Debit = result.ACCdi.Debit,
NodeCode = result.ACCa.NodeCode,
NodeTitle = result.ACCa.NodeTitle
}).ToList();

var kol2query = query.ToList();
حالا من میخوام موقع اجرا این امکان رو داشته باشم که بتونم به این دستور شرط اضافه کنم ینی این چهار فیلد رو Credit = result.ACCdi.Credit,
Debit = result.ACCdi.Debit,
NodeCode = result.ACCa.NodeCode,
NodeTitle = result.ACCa.NodeTitle
موقع اجرا تو فرم بصورت تکست باکس دارم و یه کمبو باکس که مشخص میکنه ایا میخوام این فیلد با این رشته شروع بشه یا با این رشته تموم یشه یا اینکه مساوی رشته ای که وارد میکنیم باشه

مثلا اگه برای فیلد NodeTitle مقدار iran را وارد بکنم و در کمیویاکس با مقدار زیر شروع شود را انتخاب بکنم باید دستور .Where(x => x.NodeTitle.StartsWith(iran))
به قسمت var kol2query = query.ToList();
اضافه شود ینی به شکل زیر بشه
var kol2query = query.Where(x => x.NodeTitle.StartsWith(iran)).ToList();
ایا میشه اینکارو انجام داد؟

z.gitaro
چهارشنبه 14 خرداد 1393, 23:17 عصر
واقعا کسی نیس جواب بده؟

z.gitaro
چهارشنبه 14 خرداد 1393, 23:18 عصر
جوابشو پیدا کردم!
ParameterExpression param = Expression.Parameter(typeof(RptBalanceRm), "d");

//bulid expression tree:data.Field
Expression selector = Expression.Property(param, typeof(RptBalanceRm).GetProperty("NodeTitle"));

//bulid expression tree:"etraab"
Expression right = Expression.Constant("صندوق ارزی");

//bulid expression tree:d.Field=="etraab"
Expression filter = Expression.Equal(selector, right);

//bulid expression tree:Where(d=>d.Field=="etraab")
Expression pred = Expression.Lambda(filter, param);

Expression expr = Expression.Call(typeof(Queryable), "Where",
new Type[] { kol.ElementType },
Expression.Constant(kol), pred);

//create dynamic query
var list = new List<RptBalanceRm>();
IQueryable<RptBalanceRm> query = list.AsQueryable().Provider.CreateQuery<RptBalanceRm>(expr);
var result = query.ToList();