PDA

View Full Version : سوال: مشکل datatable در linq



Iran58
یک شنبه 29 تیر 1393, 14:45 عصر
سلام
من کد زیررا نوشته ام
public DataTable all()
{
using (var db = new DataClasses1DataContext())
{
var list = db.sp_tbl_SelectAll();
return list;
}
}
امادر return list; ارور می گیرد
باید چه کدی بنویسم تا مشکل حل شود
می خواهم از این طریق داده ها را در دیتاگرید نمایش بدهم

abbas.oveissi
یک شنبه 29 تیر 1393, 17:38 عصر
سلام
من کد زیررا نوشته ام
public DataTable all()
{
using (var db = new DataClasses1DataContext())
{
var list = db.sp_tbl_SelectAll();
return list;
}
}
امادر return list; ارور می گیرد
باید چه کدی بنویسم تا مشکل حل شود
می خواهم از این طریق داده ها را در دیتاگرید نمایش بدهم
خیلی Linq بلد نیستم اما تا اونجایی که میدونم دلیل خطا باید این باشه query یک IEnumerable برمیگردونه اما مقدار بازگشتی شما DataTable هست که باعث خطا میشه.فکر کنم از یه همچین روشی باید استفاده کنید :

dataGridView.DataSource= list.ToList();

Iran58
دوشنبه 30 تیر 1393, 08:58 صبح
خیلی Linq بلد نیستم اما تا اونجایی که میدونم دلیل خطا باید این باشه query یک IEnumerable برمیگردونه اما مقدار بازگشتی شما DataTable هست که باعث خطا میشه.فکر کنم از یه همچین روشی باید استفاده کنید :

dataGridView.DataSource= list.ToList();

باسلام
متاسفانه این جواب را نمی خواستم می خواهم داخل خود تابع رفع خطا بشه

khokhan
دوشنبه 30 تیر 1393, 15:09 عصر
باسلام
متاسفانه این جواب را نمی خواستم می خواهم داخل خود تابع رفع خطا بشه
یعنی با این حساب قصد دارین نتیجه کوئری linq رو درقالب دیتاتیبل ........ اون هم بدون هیچ تغییر و تبدیلی به انجام برسونین ؟

.....نمی شه

ابتدا یه فایل کلاس خالی درست می کنین و این متد ایجاد دیتا تیبل رو می گذارین داخلش :


using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;


namespace linq_2_dt
{
static class Class1
{
public static DataTable ToDataTable<T>(this IEnumerable<T> source)
{
PropertyInfo[] properties = typeof(T).GetProperties();


DataTable output = new DataTable();


foreach (var prop in properties)
{
output.Columns.Add(prop.Name, prop.PropertyType);
}


foreach (var item in source)
{
DataRow row = output.NewRow();


foreach (var prop in properties)
{
row[prop.Name] = prop.GetValue(item, null);
}


output.Rows.Add(row);
}


return output;
}




}
}
بعد هر کجای برنامه خواستین می تونین کوئری بزنین و بریزین داخل دیتاتیبل :


private void Form1_Load(object sender, EventArgs e) {
var qury = from q in cntxt.Tbl_infos select q;

DataTable oDataTable = new DataTable();
oDataTable =Class1.ToDataTable(qury);
dataGridView1.DataSource = oDataTable;

}

Iran58
دوشنبه 30 تیر 1393, 15:19 عصر
باسلام
خطا زیر ظاهر می شود
Error 1 Extension method must be defined in a top level static class; Class1 is a nested class C:\Users\84311645\documents\visual studio 2013\Projects\3leyar\3leyar\BussinessRule\tbl.cs 67 37 3leyar

من کد زیر را نوشته ام
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;

namespace _3leyar.BussinessRule
{
class tbl
{

public int Id;
public string Name;
public string Family;
public void insert()
{
using (var db = new DataClasses1DataContext())
{
var add = db.sp_tbl_Insert(Name, Family);
}
}

public void delete()
{
using (var db = new DataClasses1DataContext())
{
var add = db.sp_tbl_DeleteRow(Id);
}
}

public void Edit()
{
using (var db = new DataClasses1DataContext())
{
var add = db.sp_tbl_Update(Id, Name, Family);
}
}

public void selectItem()
{
using (var db = new DataClasses1DataContext())
{
var Selected = db.sp_tbl_SelectRow(Id).FirstOrDefault();
Id=Selected.Id;
Name=Selected.Name ;
Family=Selected.Family ;
}
}
public IQueryable SelectAll()
{
using (var db = new DataClasses1DataContext())
{
//var query = from p in db.tblNames select p;
//return query;
var list = from c in db.tbls
select c;
return list;
}
}
}
}
دارم با linq برنامه لایه ای می نویسم و می خواهم این عمل در تایع SelectAll() انجام شود در فرم خودم بتوانم فراخوانی کنم
ممنون می شوم راهنمای بفرمایید

Iran58
دوشنبه 30 تیر 1393, 16:56 عصر
یعنی با این حساب قصد دارین نتیجه کوئری linq رو درقالب دیتاتیبل ........ اون هم بدون هیچ تغییر و تبدیلی به انجام برسونین ؟

.....نمی شه

ابتدا یه فایل کلاس خالی درست می کنین و این متد ایجاد دیتا تیبل رو می گذارین داخلش :


using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;


namespace linq_2_dt
{
static class Class1
{
public static DataTable ToDataTable<T>(this IEnumerable<T> source)
{
PropertyInfo[] properties = typeof(T).GetProperties();


DataTable output = new DataTable();


foreach (var prop in properties)
{
output.Columns.Add(prop.Name, prop.PropertyType);
}


foreach (var item in source)
{
DataRow row = output.NewRow();


foreach (var prop in properties)
{
row[prop.Name] = prop.GetValue(item, null);
}


output.Rows.Add(row);
}


return output;
}




}
}
بعد هر کجای برنامه خواستین می تونین کوئری بزنین و بریزین داخل دیتاتیبل :


private void Form1_Load(object sender, EventArgs e) {
var qury = from q in cntxt.Tbl_infos select q;

DataTable oDataTable = new DataTable();
oDataTable =Class1.ToDataTable(qury);
dataGridView1.DataSource = oDataTable;

}
باسلام در دانت 4 جواب داد اما در دات نت3.5 ارور زیر را می دهد میشه راهنمای بفرمایید
DataSet does not support System.Nullable<>.
در خط زیر
output.Columns.Add(prop.Name, prop.PropertyType);

khokhan
دوشنبه 30 تیر 1393, 21:50 عصر
باسلام در دانت 4 جواب داد اما در دات نت3.5 ارور زیر را می دهد میشه راهنمای بفرمایید
DataSet does not support System.Nullable<>.
در خط زیر
output.Columns.Add(prop.Name, prop.PropertyType);

تبدیل کوئری linq به دیتاتیبل و دیتاست در نگارشهای مختلف framwork فرق می کنه اگه اصرار دارین که از 3.5 استفاده کنین بایستی با کدهای مناسب اون نگارش کد نویسی کنی
این نمونه که براتون قرار می دم با پروسچر و به شیوه 3 لایه و linq نوشته شده و توش از انواع تبدیل کوئری به دیتاتیبل استفاده گردیده
فکر کنم با 3.5 جواب بده

Iran58
دوشنبه 30 تیر 1393, 23:56 عصر
باسلام
وتشکر از راهنمایی های ارزنده شما
مهندس
می شود جای datatable برای تابع خود چیز دیگری تعریف کنیم تا داده ها را بتوانیم در فرم مورد نظر در دیتاگرید ویا کمبوباکس نمایش بدهیم
می دانم از void نمی شود استفاده کرد چون خروجی بر نمی گرداند
دنبال چیز راحتی از datatable می گردم

khokhan
سه شنبه 31 تیر 1393, 00:46 صبح
باسلام
وتشکر از راهنمایی های ارزنده شما
مهندس
می شود جای datatable برای تابع خود چیز دیگری تعریف کنیم تا داده ها را بتوانیم در فرم مورد نظر در دیتاگرید ویا کمبوباکس نمایش بدهیم
می دانم از void نمی شود استفاده کرد چون خروجی بر نمی گرداند
دنبال چیز راحتی از datatable می گردم
چهار طریق عمده برای این کار وجود داره :لبخند: حالا ببینین کدومیک براتون آسونتره لینک http://www.codeproject.com/Articles/493389/Four-ways-of-passing-data-between-layers

Iran58
سه شنبه 31 تیر 1393, 12:47 عصر
سلام
فوق العاد خوب بود برای دیتاگرید
اما برای comboxباید چکارکرد؟