0

我對於在實體框架中使用lambda表達式很感興趣,並且在這方面會很感謝。如何在實體框架中使用lambda表達式和謂詞

在我的項目,我有兩個實體作者課程與1-M的關係(一個作者可以有多個課程):

public class Author 
{ 
    public int AuthorId {get; set;} 
    public string Name {get; set;} 

    public virtual ICollection<Course> Courses {get; set;} 
} 

public class Course 
{ 
    public int CourseId {get; set;} 
    public string Title {get; set;} 

    public int AuthorId {get; set;} 
    public virtual Author {get; set;} 
} 

我要與相關的課程檢索所有的作者 - 這同樣適用於我的項目中的其他實體。出於這個原因,我想類似於get()方法如下:

public class GenericService<T> where T : class 
{ 
    // DbContext defined 

    public IEnumerable<T> Get(...) 
    { 
     return Context... 
    } 
} 

在我的控制器動作,我會做類似下面的東西:

public ActionResult Get_Authors_With_Courses() 
    { 
     // var authors = Get (...) 
     return View(authors); 
    } 

我不知道如何定義Get(...)返回父/子對象的方法。有人可以在這方面指導我。

在此先感謝。

回答

0

你所尋找的是簡單的LINQ,

context.Authors.Include(A => A.Courses).ToList(); 

這將返回他們的課程你所有的作者。

如果你想有一個通用的一個

public class GenericService<T> where T : class 
{ 
    // DbContext defined = db 

    public IEnumerable<T> Get(string pathtoinclude = "") 
    { 
     // add checking if path is null remove the Include extension 
     // path to include in your example is courses 
     return db.Set<T>().Include(pathtoinclude).AsEnumerable(); 
    } 
} 

,你可以使用它像這樣

var authors = Get<Author>("Courses"); 
+0

閔採爾,這工作就像一個魅力。這就是我一直在尋找的東西,尤其是通用零件。有沒有辦法一次加載所有的Child對象?我認爲對於這種情況,我們必須編寫單獨的查詢。 – Tech

+0

我認爲一個更好的做法是啓用延遲加載[閱讀此](http://www.entityframeworktutorial.net/EntityFramework4.3/lazy-loading-with-dbcontext.aspx),這種方式應該工作。 – Munzer

+0

我很高興我幫助:) – Munzer

0

如果你想有一個或多個相關課程,所有的作家,那麼你需要

var authorsWithCourses = context.Authors.Where(a => a.Courses.Any()).ToList(); 

如果你還想返回課程,你可以使用包括

var authorsWithCourses = context.Authors 
    .Include(a => a.Courses) 
    .Where(a => a.Courses.Any()) 
    .ToList(); 

雖然我更喜歡在投影通常包含,所以你可以做這樣的事情

var authorsWithCourses = context.Authors 
    .Where(a => a.Courses.Any()) 
    .Select(a => new { 
     Author=a.Name, 
     Courses = a.Courses.Select(c => c.Title) 
    }) 
    .ToList(); 
+0

菲爾,我喜歡投影的想法。這有助於自定義輸出。 – Tech

相關問題