PDA

View Full Version : استفاده از storeprocedure در LINQ



En_MK
جمعه 20 تیر 1393, 02:53 صبح
سلام

میخواستم بدونم فرقی در عملکرد وبازدهی برنامه داره که دستورات اس کیو ال را درسورس برنامه بصورت (LINQ) بنویسیم یا انها را تبدیل به SP کنیم؟
اخه sp معمولا عملکرد را بهبودمیده میخوام بدونم در لینک هم همینگونه است؟

parvizwpf
جمعه 20 تیر 1393, 15:03 عصر
اینکه میگید بهبود میده. تو یک سری جاها بله. حتی از لحاظ اجرا و سرعت بله. اما شما نمیتونید همه چیز رو فدای sp کنید. بله برای برخی کوئری ها که احساس میشه سنگین هستند یا پیچیده، میشه استفاده کرد. برای اینکه بازدهی بهتری داشته باشه.

En_MK
چهارشنبه 25 تیر 1393, 04:11 صبح
سلام دوستان
من یک پروزه سه لایه دارم که با LINQپیاده سازی شده
وقتی paging گرید را true کردم با ارور زیر مواجه شدم
The data source does not support server-side data paging

خروجی متد من IQueryable است از لیست هم نمیتونم استفاده کنم چون در لایه dataبه
list<spname> دسترسی دارم اما در دولایه دیگر خیر
سئوالم اینه که چطور میتونم در LINQ از متد خروجی datasetیا datatableبگیرم؟البته اون روشی که با یک لوپ کار میشه رو بلدم

parvizwpf
چهارشنبه 25 تیر 1393, 15:38 عصر
یه نمونه از کد رو بگذارید ببینیم چطوریه

En_MK
پنج شنبه 26 تیر 1393, 00:59 صبح
ممنون از لطفتون

لایه DataAccess:
public IQueryable GetUniteForShow_DA(int Id)
{
db = new DataClassesDataContext();


var query= db.uspGetUnite (Id).AsQueryable();
return query;
}

لایه UI:

متد GetUniteForShow_BR در لایه بیزینس تعریف شده


Gridview.datasource= GetUniteForShow_BR(2);
gridView.databind();

الات خصوصیت allowPagin=true کردم ارور زیر را نمایش می دهد:
The data source does not support server-side data paging

وقتی var query را بدون تبدیل به AsQueryable ارسال کردم مشکل حل شد.سوالم اینه که چطور میتونم از sp خروجی یا dataset dataTableبگیریم بدون loop.یعنی اینطوری نمی خوام:


DataSet ds = new DataSet();
ds.Tables.Add();
ds.Tables[0].Columns.Add("fname", typeof(string));
List<DataAccessLayer.uspGetUserWithIdResult> ls = new List<uspGetUserWithIdResult>();
db = new DataClassesDataContext();
ls = db.uspGetUserWithId(userId).ToList();
for (int i = 0; i < ls.Count; i++)
{
ds.Tables[0].Rows.Add(ls[i].Fname, ls[i].Lname, ls[i].Mobile, ls[i].Email, ls[i].CardNum);
}

parvizwpf
پنج شنبه 26 تیر 1393, 03:42 صبح
http://msdn.microsoft.com/en-us/library/bb386921%28v=vs.110%29.aspx
احتمالا پیجینگ نمونه لیست شده دیتا رو میخواد.

En_MK
یک شنبه 05 مرداد 1393, 03:53 صبح
انگار بنده نتونستم منظورم را برسانم چون راهی که پیش نهاد دادید راه حل مشکل نبود
Iqueryable از پیجینگ پشتیبانی نمی کند پس باید دیتا را به DataSet یا DataTable تبدیل کرد وبنده میخواستم اینکار را بدون حلقه foreach حل کنم که با این راه حل مواجه شدم:

که برای پروژه 3لایه ودر لایه DataAccess نوشته شده است


public DataTable GetInfo(int Id)
{
db = new DataClassesDataContext();
DataTable dt=new DataTable();
dt.Columns.Add(“ID”);
dt.Columns.Add(“Name”);
var query=db.spGetInf(]d) .AsQueryable();
var reader = value.GetEnumerator();

while (reader.MoveNext())
{
var rw =reader.Current;
dt.Rows.Add(rw.Id, rw.name);
}

return dt;
}



منبع (http://www.codeproject.com/Questions/800952/How-convert-IQueryable-to-Dataset-in-LINQ-to-SQL?arn=0)

parvizwpf
یک شنبه 05 مرداد 1393, 16:25 عصر
خب باز هم حلفه در کار هست.

Mahmoud.Afrad
یک شنبه 05 مرداد 1393, 19:32 عصر
برای چه از AsQueryable استفاده میکنید؟ وقتی شما در انتها اطلاعات رو دریافت میکنید و در دیتاتیبل میریزید عملا همه داده ها رو به حافظه رم منتقل میکنید پس بهتره AsQueryable رو یا حذف کنید و یا در لایه BL از متد tolist برای انتقال داده به رم استفاده کنید و نیازی هم به تبدیل به دیتاتیبل یا دیتاست نیست.