ورود

View Full Version : سوال: تفاوت دو دستور Linq



damanpak
سه شنبه 12 اسفند 1393, 01:18 صبح
سلام به دوستان
یه سوالی برام پیش اومده در نحوه نوشتن کوئری با Linq که ممنون میشم راهنمایی کنید
من توی دیتابیسم 2 تا جدول دارم یکی Drivers و دیگری IdsOfDrivers که به یکدیگر با کلید اصلی وو کلید خارجی مرتبط هستند
حالا با این تفاسیر میخواستم بدونم فرق دو کوئری زیر (که نتیجه جفتشون یکیه) در چیه؟
و اینکه دوستان پیشنهاد میدن به کدوم روش کد نویسی کنیم؟
کوئری اول :

Using NDataBase As New MosaferBariEntities
DataGridView1.DataSource = (From F In NDataBase.IdsOfDrivers Where F.NewId = "123"
Select New With {F.Driver.ID, F.Driver.DriverName})
End Using

کوئری دوم :

Using NDataBase As New MosaferBariEntities
DataGridView1.DataSource = (From FId In NDataBase.IdsOfDrivers Join FDr In NDataBase.Drivers
On FDr.ID Equals FId.DriverId
Where FId.NewId = "123" Select New With {FDr.ID, FDr.DriverName})
End Using


در کوئری دوم از Join استفاده شده
حال با توجه به اینکه بین دوتا جدولم رابطه وجود داره آیا بازم در نوشتن کوئری نیاز به Join هست؟

SabaSabouhi
سه شنبه 12 اسفند 1393, 09:32 صبح
سلام
ظاهراً هیچ تفاوتی نداره. اما وقتی تعداد زیاد باشه، مثلاً بخوای یه لیست رو از اقلام این‌چنینی پر کنی تفاوتشون
مشخص می‌شه. وقتی که از Collectionهای داخل entity استفاده می‌کنی، نسبت به Join خیلی کندتر هست.
تو بازیابی یه تک رکورد متوجه چیزی نمی‌شی، اما کلاً سعی کن از join استفاده کنی. تو تعداد زیاد رکود به شکل
خیلی واضحی اختلاف زمانی رو متوجه می‌شی.
و چرا از Extension Methods و Lambda استفاده نمی‌کنی؟ به نظر من خیلی خوانایی کد بالا می‌ره.

صبا صبوحی

damanpak
سه شنبه 12 اسفند 1393, 15:02 عصر
سلام
خیلی ممنون بابت وقتی که گذاشتید
به نکته جالبی اشاره کردید که منم تست کردم و متوجه شدم توی تعداد رکورد زیاد Join خیلی سریعتر جواب میده
اتفاقا من خیلی دوست دارم با لامبدا کار کنم اما توی Vb.net نمیشه(یا اینکه من بلد نیستم)

SabaSabouhi
سه شنبه 12 اسفند 1393, 15:26 عصر
سلام
خیلی ممنون بابت وقتی که گذاشتید
به نکته جالبی اشاره کردید که منم تست کردم و متوجه شدم توی تعداد رکورد زیاد Join خیلی سریعتر جواب میده
اتفاقا من خیلی دوست دارم با لامبدا کار کنم اما توی Vb.net نمیشه(یا اینکه من بلد نیستم)

سلام
دوست عزیز، همیشه برای هدایت به راه راست فرصت هست.
همین الان از VB خداحافظی کرده و به سمت #C بشتابید.

شوخی بود ناراحت نشی‌ها :)

راستش شاید تو VB نباشه، چون تا جایی که من می‌دونم Anonymous Methods یکی از قابلیت‌های جدید #C هست. حالا شاید
تو VB هم پیاده سازی شده باشه، شاید هم نشده باشه.
راستش چون خود بیل گیتس، basic کار بود، خیلی علاقه داشت که VB خوب گسترش پیدا کنه، اما الان که دیگه از مدیریت مایکروسافت
رفته کنار، گمان نکنم کسی باشه که این قدر به این زبون اهمیت بده.

صبا صبوحی

damanpak
چهارشنبه 13 اسفند 1393, 00:09 صبح
سلام مجدد و تشکر بابت پاسختون
بنده جواب سوالم رو در این لینک (http://www.dotnettips.info/post/840/ef-code-first-10) پیدا کردم