2013-07-05 28 views
2

我有兩張桌子。問題和用戶配置我可以使用LINQ在SQL Server上對IQueryable進行連接嗎?

public QuestionMap() 
    { 
     this.HasKey(t => t.QuestionId); 

     this.Property(t => t.Title) 
      .IsRequired() 
      .HasMaxLength(100); 

     this.Property(t => t.CreatedBy) 
      .IsRequired(); 
    } 

    public UserProfileMap() 
    { 
     this.HasKey(t => t.UserId); 

     this.Property(t => t.UserName) 
      .IsRequired() 
      .HasMaxLength(56); 
    } 

我的庫調用看起來像這樣的時刻:

public virtual IQueryable<T> GetAll() 
    { 
     return DbSet; 
    } 

有沒有辦法,我可以修改資料庫調用,這樣它會去到數據庫中,加入問題的辦法和UserProfile表,然後從UserProfile表中取回具有UserName的列表?我意識到我可能需要爲返回類型創建另一個類(包括UserName),我可以這樣做。

+0

這兩個實體如何相互關聯? 'CreatedBy'是一個UserProfile? –

+0

CreatedBy是一個鏈接到UserProfile表中的UserId的數字。我真正想要的不是看到那個號碼,而是看到UserName是一個字符串。 – Alan2

+0

如果您決定使用它們,那麼通用存儲庫不應各自擁有自己的上下文。你永遠無法再從他們的'DbSets'中編寫查詢。他們應該分享一個工作單元的背景。但第一個問題是,您是否真的需要在EF的內置存儲庫('DbSet')之上使用通用存儲庫。 –

回答

2

您不能配置屬性映射到某個連接實體的字段。但是你可以在你的問題和用戶配置的entites創建的導航性能,這將提供加入enitites:

public class Question 
{ 
    public int QuestionId { get; set; } 
    public string Title { get; set; } 
    public virtual UserProfile CreatedBy { get; set; } 
} 

public class UserProfile 
{ 
    public int UserId { get; set; } 
    public string UserName { get; set; } 
    public virtual ICollection<Question> Questions { get; set; } 
} 

並添加映射配置給用戶映射:

HasMany(u => u.Questions) 
    .WithRequired(q => q.CreatedBy) 
    .Map(m => m.MapKey("UserId")) 
    .WillCascadeOnDelete(true); 

現在,您將能夠渴望負荷用戶查詢問題時:

var questions = context.Questions.Include(q => q.CreatedBy); 
foreach(var question in questions) 
    Console.WriteLine(question.CreatedBy.UserName); 
0

你應該加入你的控制器而不是你的倉庫。存儲庫應該只處理數據庫中的一個實體。

或者您可以在您的數據庫中創建一個視圖,並將其作爲實體添加到您的實體框架模型中。

0

其實,you CAN join tables using LINQ without navigation properties.讓我證明:

public class Question 
{ 
    public int QuestionID { get; set; } 
    public string Title { get; set; } 
    public string TextBody { get; set; } 
    public int CreatedBy { get; set; } 
} 

public class UserProfile 
{ 
    [Key] 
    public int UserID { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
} 

這就是(非常簡單)模型。現在,我完全不熟悉OP的帖子中顯示的IQueryable<T> GetAll()方法,但我假設可以使用此方法返回IQueryable<Question>,該方法在執行時會從數據庫中獲取所有問題。在我的例子,我只是將使用MyDbContext代替,但是這可能與你的另一種方法,如果你喜歡它來代替......

所以LINQ加入將做如下:

public void SomeMethod() 
{ 
    var results = MyDbContext.Questions.Join(MyDbContext.UserProfiles, 
     q => q.CreatedBy, 
     u => u.UserID, 
     (q,u) => new { 
      q.QuestionID, 
      q.Title, 
      q.TextBody, 
      u.UserName 
     }); 
    foreach (var result in results) 
    { 
     Console.WriteLine("User {0} asked a question titled {1}:", 
      result.UserName, result.Title); 
     Console.WriteLine("\t{0}", result.TextBody) 
    } 
} 

現在,我認爲導航屬性對於這樣明顯和常見的關係更好。但是,有時您可能不想爲很少引用的關係添加導航屬性。在這些情況下,使用Join方法可能會更好。

相關問題