PDA

View Full Version : سوال: فیلتر کردن داده ها با Linq کوئری داینامیک



kavayo
سه شنبه 25 آذر 1393, 17:55 عصر
من در برنامه ای میخوام یک گزارش چند گانه تهیه کنم مثلا دو تا combobox میزارم اولی برای انتخاب فیلدی از جدول دومی برای عملگر ریاضی مثل = و یا >< و یک textboxبرای مقدار قابل گزارش ایجاد میکنم مثلا در جدول دانشجویان مقدار اولین combobox را سن دانشجو و مقدار دومین combobox رو علامت ">" و مقدار textbox رو 25 قرار دهم یعنی در کل سن دانشجویانی که بیشتر از 25 سال سن دارند رو میخوام خروجی بگیرم حال چطور این کار رو با linq میتونم انجام بدم ؟

حسین.کاظمی
چهارشنبه 26 آذر 1393, 10:01 صبح
سلام میتونی توی کوئریت از کلمات کلیدی and or عملگرهای منطقی و ریاضی و.. استفاده کنید
یه مثال میزنم واستون
select name,family,age,datebrith from tbl_name where age < 25 and datebrith > 1360/06/01

شما به این شکل میتونی اطلاعات را براساس انواع شرطها به نمایش بزاری و گزارش بگیری تو همین سایتم میتونی جست و جو کنی
موفق باشی

Behnam6670
چهارشنبه 26 آذر 1393, 13:11 عصر
var filter = from p in db.tblPersons
where p.fIdentity >= int.Parse(txtfCode.Text) && p.fIdentity <= int.Parse(txteCode.Text)
select new
{
p.fIdentity,
p.fName,
p.fFamily,
p.fOrganizationalPosts,
p.fLeaveWork,
fEmpDate = p.fEmpDateS,
};


if (chkShift.Checked)
{
filter = filter.Where(c => c.fShift.Equals(shiftID));
}
if (chkGroup.Checked)
{
filter = filter.Where(c => c.fGroup.Equals(comGroup.SelectedItem));
}

مهرداد صفا
چهارشنبه 26 آذر 1393, 21:44 عصر
با سلام.
می تونید از Expression tree استفاده کنید.
کلاس System.Linq.Expressions.Expression با الگوی Factory وظیفه ساخت انواع عبارات مختلف رو داره که برای ساخت کئری داینامیک می تونید ازش استفاده کنید.
متود Property این کلاس می تونه یک خصوصیت از شی رو با گرفتن نامش، در غالب یک Expression بر گردونه.
از ParameterExpression ها می تونید به عنوان پارامتر های delegate ها استفاده کنید؛ واضحه که با متود Expression.Parameter می تونید یک نمونه از این نوع بسازید.
و واضحتر اینکه Expression.Const می تونه یک مقدار ثابت (رشته، عدد ...) رو در غالب یک عبارت به ما بده.
و واضحترتر:بامزه: این مثاله:


//بسم الله الرحمن الرحیم
//اللهم صل علی محمد و آل محمد

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Linq.Expressions;
namespace WindowsFormsApplication1
{
struct Person
{
public int Age { get; set; }
public string Name { get; set; }
public Person(int _age,string _name ):this()
{
this.Age = _age;
this.Name = _name;
}
}
public partial class Form1 : Form
{
Person[] source;

public Form1()
{
InitializeComponent();
source=new Person[]{
new Person(10,"ali"),
new Person(20,"reza"),
new Person(18,"ahmad")};
//قرار دادن علایم و نوع عبارت مناظر با آنها در یک دیکشنری
Dictionary<string, ExpressionType> operators = new Dictionary<string, ExpressionType>();
operators.Add("کمتر از",ExpressionType.LessThan);
operators.Add("بیشتر از", ExpressionType.GreaterThan);
operators.Add("برابر", ExpressionType.Equal);
//Combo2.DataSource=operators.Keys....
//گرفتن نام فیلد کئری به صورت رشته
//var fieldName=combo1.SelectedItem...
var FieldName = "Age";
//مقدار فیلتر
//myAge=textbox.Text....
int myAge = 16;
//گرفتن عملگر مقایسه ای شرط کوئری از ورودی
//operator=combo2.SelectedItem...
string myOperator="بیشتر از";
//ساخت کوئری داینامیک شبیه به
//source.Where(p=>p.Age>16)...
IQueryable<Person> QSource=source.AsQueryable<Person>();
//ساخت عبارت پارامتر
//این عبارت به ازای هر عضو از QSource به متود Where ارسال خواهد شد
var p=Expression.Parameter(typeof(Person),"p");
//ساخت عبارت سمت چپ شرط (خصوصیت Age از Person
var left = Expression.Property(p, "Age");
//ساخت عبارت سمت راست شرط
var right = Expression.Constant(myAge);
//ساخت عبارت شرطی
//p.Age>myAge//16
//بر اساس عملگر ورودی از رشته
var c = Expression.MakeBinary(operators[myOperator], left, right);
//ساخت predicate نهایی که وظیهفه فیلتر کردن رو دارد و به متود Where ارسال می شود
var lambda = Expression.Lambda<Func<Person, bool>>(c, p);
//اجرای کوئری و نمایش افراد بیشتر از 16 سال
dataGridView1.DataSource = QSource.Where(lambda).ToList();
}
}
}