PDA

View Full Version : تبدیل نتیجه LINQ به DataTable



misaqkfm
یک شنبه 17 مرداد 1395, 09:07 صبح
با عرض سلام و خسته نباشید

بنده می خواهم یک کوئری بنویسم که به جای اینکه بگویم .Tolist() در Linq & Lambda خروجی را از نوع DataTable برگردانم لطفا راهنمایی فرمایید

به عنوان مثال کد زیر
var qyery = db.TblUsers.where(x => x.id != 0).Tolist();
کد بالا را خروجی از نوع DataTable تولید کند و از همین روش Linq & lambda استفاده نماید

با احترام

یاریان

Mahmoud.Afrad
یک شنبه 17 مرداد 1395, 09:32 صبح
یکی از خوبی هایی که LINQ داره اینه که دیگه نیازی به دیتاتیبل و دیتاست نیست. حالا شما برای چه مقصودی به این تبدیل نیاز دارید؟

misaqkfm
یک شنبه 17 مرداد 1395, 09:36 صبح
بنده دارم با کامپوننت DevExpress کار می کنم که کار این کامپوننت خیلی هوشمندانه هست به طوری که در تجزیه و تحلیل داده ها به صورت نمودار بسیار انعطاف پذیر و دقیق عمل کرده
منتها این کامپوننت برای نمایش نمودار باید از DataTable استفاده کنیم
به همین دلیل است که اینجا رو به مشکل بر خوردم

misaqkfm
یک شنبه 17 مرداد 1395, 09:37 صبح
using System.Data.Sql;

var query = db.TblUsers.Where(x => x.Id != 0).ToList();
DataTable DT = new DataTable();
DT.Clear();
DT.Columns.Add("نام");
DT.Columns.Add("نام خانوادگی");

foreach (var item in query)
{
Object[] O = { item.Name,item.Family };
DT.Rows.Add(O);
}

dataGridView1.DataSource = DT

من خودم تا اینجا ها رو پیش رفتم فقط می خوام حالا به جای اون قسمتی که از foreach استفاده کردم یک جایگزینی براش در نظر بگیرم که کدها با سرعت بیشتری Load بشه
حالا قسمت DataGridView یک نمونست که ما حالا باید از اون کامپوننت DevExpress استفاده کنیم

misaqkfm
یک شنبه 17 مرداد 1395, 09:51 صبح
اگه بتونی راهنمایی کنی ممنون میشم

Iran58
یک شنبه 17 مرداد 1395, 09:59 صبح
radGridView1.DataSource = db.TblUsers.Where(x => x.Id != 0).ToArray();

misaqkfm
یک شنبه 17 مرداد 1395, 10:04 صبح
این که به آرایه تبدیل می کنه نه DataTable??????

Iran58
یک شنبه 17 مرداد 1395, 10:33 صبح
این که به آرایه تبدیل می کنه نه DataTable??????
شما مگه نمی خواهید داخل دیتاگرید نمایش بدهید؟

ژیار رحیمی
یک شنبه 17 مرداد 1395, 13:02 عصر
using System.Data.Sql;

var query = db.TblUsers.Where(x => x.Id != 0).ToList();
DataTable DT = new DataTable();
DT.Clear();
DT.Columns.Add("نام");
DT.Columns.Add("نام خانوادگی");

foreach (var item in query)
{
Object[] O = { item.Name,item.Family };
DT.Rows.Add(O);
}

dataGridView1.DataSource = DT

من خودم تا اینجا ها رو پیش رفتم فقط می خوام حالا به جای اون قسمتی که از foreach استفاده کردم یک جایگزینی براش در نظر بگیرم که کدها با سرعت بیشتری Load بشه
حالا قسمت DataGridView یک نمونست که ما حالا باید از اون کامپوننت DevExpress استفاده کنیم



IEnumerable<DataRow> query = db.TblUsers.AsEnumerable().Where(x => x.Id != 0);
DataTable boundTable = query.CopyToDataTable<DataRow>();

Iran58
دوشنبه 18 مرداد 1395, 07:35 صبح
IEnumerable<DataRow> query = db.TblUsers.AsEnumerable().Where(x => x.Id != 0);
DataTable boundTable = query.CopyToDataTable<DataRow>();


سلام
وقتی کد زیر را مینوسم

IEnumerable<DataRow> query = db.TblUsers.AsEnumerable().Where(x => x.Id != 0);
DataTable boundTable = query.CopyToDataTable<DataRow>();
ارور زیر را می دهد
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<WindowsFormsApplication9.Sentinel_WatchType>' to 'System.Collections.Generic.IEnumerable<System.Data.DataRow>'. An explicit conversion exists (are you missing a cast?)

misaqkfm
دوشنبه 18 مرداد 1395, 08:19 صبح
IEnumerable<DataRow> query = db.TblUsers.AsEnumerable().Where(x => x.Id != 0);
DataTable boundTable = query.CopyToDataTable<DataRow>();



این خطا رو میده!!!!!!!!

ژیار رحیمی
دوشنبه 18 مرداد 1395, 14:50 عصر
دوست گرامی مشکل Cast کردن خط اول هست.خط اول رو بصورت زیر بنویس ببین مشکلت حل میشه.در بخش Select فیلدهایی از جدول TblUser که میخوای در نتیجه کویری داشته باشی رو اصلاح کن

IEnumerable<DataRow> query = db.TblUsers.AsEnumerable().Where(x => x.Id != 0)
.ُSelect(c=>new DataRow{c.Uname,C.Password,..});

سریم به این لینک ها بزن
https://msdn.microsoft.com/en-us/library/bb386921(v=vs.110).aspx
http://stackoverflow.com/questions/17088779/fill-datatable-from-linq-query

misaqkfm
سه شنبه 19 مرداد 1395, 08:07 صبح
دوست گرامی مشکل Cast کردن خط اول هست.خط اول رو بصورت زیر بنویس ببین مشکلت حل میشه.در بخش Select فیلدهایی از جدول TblUser که میخوای در نتیجه کویری داشته باشی رو اصلاح کن

IEnumerable<DataRow> query = db.TblUsers.AsEnumerable().Where(x => x.Id != 0)
.ُSelect(c=>new DataRow{c.Uname,C.Password,..});

سریم به این لینک ها بزن
https://msdn.microsoft.com/en-us/library/bb386921(v=vs.110).aspx
http://stackoverflow.com/questions/17088779/fill-datatable-from-linq-query


این هم متاسفنه 2 تا خطا داد

Error 1 'System.Data.DataRow.DataRow(System.Data.DataRowBu ilder)' is inaccessible due to its protection level C:\Documents and Settings\m.yarian\My Documents\Visual Studio 2008\Projects\WindowsFormsApplication5\WindowsForm sApplication5\Form1.cs 34 24 WindowsFormsApplication5

Error 2 Cannot initialize type 'System.Data.DataRow' with a collection initializer because it does not implement 'System.Collections.IEnumerable' C:\Documents and Settings\m.yarian\My Documents\Visual Studio 2008\Projects\WindowsFormsApplication5\WindowsForm sApplication5\Form1.cs 34 35 WindowsFormsApplication5

ژیار رحیمی
سه شنبه 19 مرداد 1395, 17:32 عصر
دوست گرامی روش قبلی رو تست کردم جواب نداد بجاش با استفاده از این Extension Method به راحتی میشه LINQ کویری رو به DataTable تبدیل کرد. ابتدا کلاس زیر رو به پروژه ت اضافه کن

public static class ExMetoth
{
public static DataTable ToDataTable<T>(this List<T> items)
{
var tb = new DataTable(typeof(T).Name);


var props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);


foreach (var prop in props)
tb.Columns.Add(prop.Name, prop.PropertyType);


foreach (var item in items)
{
var values = new object[props.Length];
for (var i = 0; i < props.Length; i++)
values[i] = props[i].GetValue(item, null);


tb.Rows.Add(values);
}


return tb;
}
}


سپس کویری رو به صورت زیر تغییر بده

DataTable dt = db.TblUsers.Where(x => x.Id != 0).ToList().ToDataTable();


موفق باشی.

misaqkfm
چهارشنبه 20 مرداد 1395, 10:33 صبح
این که باز از حلقه ی foreach استفاده شده
مساله اینجاست بدون حلقه ی foreach انجام شود

misaqkfm
چهارشنبه 20 مرداد 1395, 10:33 صبح
جواب سوال این است بدون استفاده از یک حلقه ی خاص
نمیخواید تشکر کنید!!!!
DataTable DT = new DataTable();
DT.Clear();
DT.Columns.Add("نام");
DT.Columns.Add("نام خانوادگی");


DataTable dtNew = db.TblUsers.Where(x => x.Id != 0).Select(k => {
var row = DT.NewRow(); row.ItemArray = new object[] {
k.Name,
k.Family };
return row;
}).CopyToDataTable();