PDA

View Full Version : مشکل در select با linq



mrali.jalali
دوشنبه 30 آذر 1394, 20:47 عصر
سلام دوستان
من به روش زیر در linq ، کوئری می زنم . وقتی پروفایلر sql میبینم همه جدول رو انتخاب میکنه و بر می گردونه و در خود برنامه شرط رو اعلام میکنه که فکر میکنم اصولی نباشه

var query = from row in Ld.Vw_Earchive_Pat_Rad_Pths.ToList()
where row.PAT_NO == Frm_Patient.PatNO
select new { row.ANS_TEXT, row.doctypename };

همچنین برای جست و جو در گرید از روش زیر استفاده میکنم که برای هر بار جست و جو دوباره کوئری روی sql انجام میشه که اینم بنظرم درست نیست

string[] allWord = txt_search.Text.Split ( ' ' );
var query = from row in Ld.Vw_Earchive_Patients.ToList ()
where allWord.All(word => (row.Pat_No.ToLower() + row.Pat_FirstName.ToLower() +
row.Pat_LastName.ToLower() + row.Pat_FatherName.ToLower() + row.Pat_NationalCode).Contains(word))
select new { row.Pat_No, row.Pat_FirstName, row.Pat_LastName, row.Pat_NationalCode };

از دوستان میخام نظرشونو بگن .ممنون

Mahmoud.Afrad
دوشنبه 30 آذر 1394, 23:53 عصر
.ToList() باعث میشه همه داده ها به رم منتقل بشن. این قسمت رو حذف کن.
برای جستجو در دیتاگرید هم میتونید روی دیتاسورسی که به دیتاگرید دادید جستجو کنید. یا روی سطرهای دیتاگرید پیمایش کنید. جستجو کنید در هر دو مورد قبلا تاپیک ایجاد شده.

mrali.jalali
یک شنبه 06 دی 1394, 22:41 عصر
سلام مجدد . در مورد قسمت اول سوالم .من ToList() رو برداشتم ولی پیغام خطای زیر رو داد که بخاطر شرطه . (من یک تکست باکس دارم که کاربر می تونه بر اساس چند پارامتر شرط وارد کنه مثلا بخشی از نام و بخشی از فامیل به صورت همزمان که با اسپیس از هم جدا میشن ) که قبلش مشکل نداشت

Local sequence cannot be used in LINQ to SQL implementation of query operators except the Contains() operator.

ممنون میشم بازم کمکم کنی

Mahmoud.Afrad
دوشنبه 07 دی 1394, 18:17 عصر
دقیقا مشخص کنید روی چه چیزی میخواهید جستجو کنید. آیا میخواهید اول دیتاگرید رو پر کنید و بعد روی دیتاگرید فیلتر انجام بدید یا هر بار باید اطلاعات از دیتابیس بیاد.
خب الان این دو کوئری روی دو جدول انجام میشن. چرا؟
خطا به خاطر متدهایی هست که در قسمت جستجو به کار بردید و نمیتونه اونها رو به کد sql ترجمه کنه.
ساختار جداول رو بزارید و بگید نتیجه مورد نظر شما چیه. اگر میتونی برنامه رو قرار بدید.

mrali.jalali
دوشنبه 07 دی 1394, 22:15 عصر
روی فرم یک تکست باکس و گرید دارم . میخام کاربر داخل تکست کلمات مورد نظر را وارد کنه . که میتونه جست و جو براساس همه پارامتر ها به صورت همزمان باشه(مثلا عبارت عل" جل 0913 "رو که وارد کرد داخل دیتابیس فیلد های نام و نام خانوادگی و شماره موبایل که شبیه به کلمات بالاست رو انتخاب کنه و در گرید نشون بده . کلمات وارد شده برای جست و جو با اسپیس از هم جدا میشه با دستور زیر این کار انجام میشه. فیلدها جدولم هم نام و نام خانوادگی و شماره موبایل و ... هستند که جست رو فقط رو سه فیلد گفته انجام بشه . در پست اولم در سوال اولم که مطرح کردم این کار انجام میشه ولی داخل خود برنامه شرط رو اعمال میکنه نه با sqlserver که درست نیست
string[] allWord = txt_search.Text.Split ( ' ' );

Mahmoud.Afrad
سه شنبه 08 دی 1394, 00:35 صبح
به صورت مثال زیر شرط را به کوئری اضافه کنید

if (string.IsNullOrWhiteSpace(textBox1.Text)) return;
List<string> allWords = textBox1.Text.ToLower().Split(' ').Where(w => !string.IsNullOrWhiteSpace(w)).ToList();

DataClasses1DataContext db = new DataClasses1DataContext();
var query = db.tbls.AsQueryable();

foreach (string word in allWords)
{
query = query.Where(item => (item.FirstName + item.LastName + item.Tellphone).ToLower().Contains(word));
}

dataGridView1.DataSource = query;