PDA

View Full Version : سوال: نمایش جدول با EF در DGView و Join جداول در Entity Framework



Amir4317
شنبه 22 فروردین 1394, 00:20 صبح
درود و سلام بر برنامه نویسان گران

من در EF تازه کارم.
اول اینکه می خوام اطلاعات یک جدول رو درون Data Grid View نمایش بدم.
کد زیر رو نوشتم

var a = new BCMDBEntities().Attendances;
var b = a.Where(x => x.aID > 0);
attendanceBindingSource.DataSource = b;

گیر میده:
{"Data binding directly to a store query (DbSet, DbQuery, DbSqlQuery, DbRawSqlQuery) is not supported. Instead populate a DbSet with data, for example by calling Load on the DbSet, and then bind to local data. For WPF bind to DbSet.Local. For WinForms bind to DbSet.Local.ToBindingList(). For ASP.NET WebForms you can bind to the result of calling ToList() on the query or use Model Binding, for more information see http://go.microsoft.com/fwlink/?LinkId=389592."}


که خب من درست سر در نیاوردم که اطلاعات رو اول توی کجا بریزم.

بعد هم اینکه برای Join جداول با استفاده از Linq و EF چه کار کنم؟
یعنی این جدول شماره ردیف شخص توشه که من میخوام نام شخص رو از جدول دیگه ای بخونه و کنار این نشون بده.

پیشاپیش ممنون از همراهی راهنمایی هاتون.

SabaSabouhi
شنبه 22 فروردین 1394, 09:19 صبح
درود و سلام بر برنامه نویسان گران

من در EF تازه کارم.
اول اینکه می خوام اطلاعات یک جدول رو درون Data Grid View نمایش بدم.
کد زیر رو نوشتم

var a = new BCMDBEntities().Attendances;
var b = a.Where(x => x.aID > 0);
attendanceBindingSource.DataSource = b;

گیر میده:
{"Data binding directly to a store query (DbSet, DbQuery, DbSqlQuery, DbRawSqlQuery) is not supported. Instead populate a DbSet with data, for example by calling Load on the DbSet, and then bind to local data. For WPF bind to DbSet.Local. For WinForms bind to DbSet.Local.ToBindingList(). For ASP.NET WebForms you can bind to the result of calling ToList() on the query or use Model Binding, for more information see http://go.microsoft.com/fwlink/?LinkId=389592."}


که خب من درست سر در نیاوردم که اطلاعات رو اول توی کجا بریزم.

بعد هم اینکه برای Join جداول با استفاده از Linq و EF چه کار کنم؟
یعنی این جدول شماره ردیف شخص توشه که من میخوام نام شخص رو از جدول دیگه ای بخونه و کنار این نشون بده.

پیشاپیش ممنون از همراهی راهنمایی هاتون.

سلام
این شکلی عمل کن:


using ( var entities = new BCMDBEntities() ){
var list = Attendances.Where( x=> x.aId > 0 );
attendanceBindingSource.DataSource = list;
}

شما بجای این که Context رو new کنی، کلاس Attendances رو new کرده بودی.
ضمن این که سعی کن حتماً از using استفاده کنی.

صبا صبوحی

Hamid2547
شنبه 22 فروردین 1394, 09:33 صبح
علاه بر چیزی که در پست قبلی گفته شد، وقتی میخاید کوئری بنویسید آخرش باید ToList() رو صدا بزنید، چون کوئری شما از لیزی لودینگ استفاده میکنه و تا زمانی که از چیزی مثل فورایچ استفاده نکنید چیزی توی آرایتون نیست که بخاد بایند بشه.

var b = a.Where(x => x.aID > 0).ToList();
attendanceBindingSource.DataSource = b;
attendanceBindingSource.DataBind();

Amir4317
شنبه 22 فروردین 1394, 10:47 صبح
سپاس فراوان از صبا و حمید عزیز

حمید جان کلاس attendanceBindingSource.DataBind(); رو خودم باید بنویسم؟
چون اصلاٌ نمیتونه چیزی براش پیدا کنه و منم نذاشتمش و به خوبی دیتا رو لود کرد.

صبای عزیز ممنونم از راهنماییتون، از این به بعد همیشه از Using بهره می‌برم.
__________________________________________________ __________


و اما سوال دوم درمورد Join
جدول اول شامل ID شخصه و Datetime ورودشه
جدول دوم هم که خب همه‌ی اطلاعات اشخاص توشه

می‌خواستم توی DGV به جای pID مقدار نام کامل شخص رو نشون بده
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;


خودم یه کلاس به Attendances اضافه کردم


public string FullName { get { return this.GetPersonInfo().FullName; } }

که میره می گرده از جدول اشخاص کل اطلاعات شخص رو می گیره و اسم و فامیلش رو با هم برمی‌گردونه.
بعد به DGV یه ستون دادم و Bind کردم.

130221

سبزها ماله خوده Database هستند و من چندتا کلاس دلخواه اضافه کردم.


راه بهتری هست؟
مستقیم از راه Query با Linq بشه Join کردشون؟

Hamid2547
شنبه 22 فروردین 1394, 11:00 صبح
حمید جان کلاس attendanceBindingSource.DataBind(); رو خودم باید بنویسم؟
چون اصلاٌ نمیتونه چیزی براش پیدا کنه و منم نذاشتمش و به خوبی دیتا رو لود کرد.

نه اشتباه از من بود، فکر کردم نوع پروژتون وب هست و از گرید ویو استفاده کردید.

Amir4317
شنبه 22 فروردین 1394, 13:03 عصر
مرسی
برای Join کسی نبود راهنمایی کنه؟

SabaSabouhi
شنبه 22 فروردین 1394, 13:50 عصر
علاه بر چیزی که در پست قبلی گفته شد، وقتی میخاید کوئری بنویسید آخرش باید ToList() رو صدا بزنید، چون کوئری شما از لیزی لودینگ استفاده میکنه و تا زمانی که از چیزی مثل فورایچ استفاده نکنید چیزی توی آرایتون نیست که بخاد بایند بشه.

var b = a.Where(x => x.aID > 0).ToList();
attendanceBindingSource.DataSource = b;
attendanceBindingSource.DataBind();


سلام
تو این حالت نیازی نیست ToList فراخوانی بشه. فراخوانی ToList هنگامی لازمه که ما به IEnumerable نیاز داشته باشیم. مثل همون
ForEach که شما مثال زدی. اما برای دادن خروجی به DataSource نیازی به این کار نداریم. خود کنترل این کار رو انجام می‌ده.

صبا صبوحی

SabaSabouhi
شنبه 22 فروردین 1394, 13:55 عصر
مرسی
برای Join کسی نبود راهنمایی کنه؟

سلام
با Lambda این کارها خیلی خیلی راحته.


using ( var entities = new DbEntities() ){
var list = entities.Table1
.Where( <MyCondition> )
.Join ( entities.Table2, t1=>t1.Column, t2=>t2.Column, ( t1, t2 ) => new { T1Values = t1, T2Values = t2 } )
.Where( x=> x.T2Values.Date > MyDate )
.OrderBy( x=> x.T1.Id )
.ToList();
}

این یه مثال بود. با شرط‌ها و شرایط فرضی.
این Joinها تو Lambda واقعاً قدرت‌مند و شگفت‌انگیز هستن. هر کاری بخوای می‌تونی بکنی با حداکثر خوانایی
و به اندازه‌ای می‌تونی dynamic کار کنی باهاش که شاید باورت نشه.

صبا صبوحی