مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

salman_b

عضویت از 1396/02/18

جوین زدن حریصانه شرطی در EF

  • جمعه 12 مرداد 1397
  • 09:20
تشکر میکنم

باسلام

میخواستم بین دو جدول جوین بزنم و فقط یه سری رکورد با شرط مشخصی رو از جدول دوم بکشم بیرون

ولی هرچی مینویسم EF یا نمیذاره داخل Include شرط اعمال کنم یا اگه توی Select شرط رو اعمال کنم کل جدول دوم رو میکشه بیرون و آخرش سمت سی شارپ شرط رو اعمال میکنه و لیست میکنه.

در ضمن Lazy Loading هم خاموش هستش.

چطوری میشه Include شرط دار نوشت ؟!

پاسخ های این پرسش

تعداد پاسخ ها : 4 پاسخ
کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • جمعه 12 مرداد 1397
  • 09:50

Eagerly Loading

using (var context = new BloggingContext()) 
{ 
    // Load all blogs and related posts 
    var blogs1 = context.Blogs 
                          .Include(b => b.Posts) 
                          .ToList(); 
 
    // Load one blogs and its related posts 
    var blog1 = context.Blogs 
                        .Where(b => b.Name == "ADO.NET Blog") 
                        .Include(b => b.Posts) 
                        .FirstOrDefault(); 
 
    // Load all blogs and related posts  
    // using a string to specify the relationship 
    var blogs2 = context.Blogs 
                          .Include("Posts") 
                          .ToList(); 
 
    // Load one blog and its related posts  
    // using a string to specify the relationship 
    var blog2 = context.Blogs 
                        .Where(b => b.Name == "ADO.NET Blog") 
                        .Include("Posts") 
                        .FirstOrDefault(); 
}

Eagerly loading multiple levels

using (var context = new BloggingContext()) 
{ 
    // Load all blogs, all related posts, and all related comments 
    var blogs1 = context.Blogs 
                       .Include(b => b.Posts.Select(p => p.Comments)) 
                       .ToList(); 
 
    // Load all users their related profiles, and related avatar 
    var users1 = context.Users 
                        .Include(u => u.Profile.Avatar) 
                        .ToList(); 
 
    // Load all blogs, all related posts, and all related comments  
    // using a string to specify the relationships 
    var blogs2 = context.Blogs 
                       .Include("Posts.Comments") 
                       .ToList(); 
 
    // Load all users their related profiles, and related avatar  
    // using a string to specify the relationships 
    var users2 = context.Users 
                        .Include("Profile.Avatar") 
                        .ToList(); 
}

کاربر سایت

salman_b

عضویت از 1396/02/18

  • جمعه 12 مرداد 1397
  • 09:57

خب اینها که هیچ کدوم شرطی رو به جوینشون اضافه نکردن

مثلا تو این مثال

    // Load one blogs and its related posts 
    var blog1 = context.Blogs 
                        .Where(b => b.Name == "ADO.NET Blog") 
                        .Include(b => b.Posts) 
                        .FirstOrDefault(); 

بیاد اون پست هایی که رو بکشه بیرون که بین فلان بازه ی تاریخی ثبت شدند یا عنوانشون فلان کلمه ی کلیدی رو داره.

چطور میشه همچین حالتی رو نوشت ؟

کاربر سایت

salman_b

عضویت از 1396/02/18

  • جمعه 12 مرداد 1397
  • 10:13

من یکی نوشتم الان

اما مشکلش اینه نمیذاره به مدل اصلی cast کنمش و فقط anynomous برمیگردونه


                var blog1 = dbContex.Blogs
                    .Where(b => b.Name == "ADO.NET Blog")
                    .Include(b => b.Posts)
                    .Select(c => new { Posts = c.Posts.Where(d => d.Title == "My Title"), ... })
                    .ToList();

با پروفایلر هم چک کردم، کوئری درستی رو میفرسته سمت دیتابیس

اما چیکار کنم تا به مدل اصلی Cast بشه ؟

چون میخوام تو مخرن های DataAccess بنویسمش و لیستی از مدل اصلی رو برگردونم

با تشکر

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • جمعه 12 مرداد 1397
  • 10:21

باید از ViewModel برای خروجی استفاده کنید 

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)