2011-03-09 70 views
5

嗨,我剛剛升級到Framework 4.0,並添加關係外鍵到我的數據庫。我想加入2個表User and Staff並返回到UI。工作人員表具有UserId。不得不說,無論何時在datagridview上單擊用戶名,我都想向所有文本框顯示User和Staff數據。linq返回使用Tuple

我做到這一點使用元組

public IEnumerable<Tuple<User, Staff>> Get() 
    { 
     using (qDataContext db = new qDataContext()) 
     { 
      try 
      { 
       var r = from u in db.Users 
         join s in db.Staffs on u.Id equals s.UserId 
         select new Tuple<User, Staff>(u, s); 

       return r; 
      } 
      catch (Exception ex) 
      { 
       throw; 
      } 
     } 
    } 

但是在UI,我應該怎麼辦的結合? gvUser.DataSource = user.Get();

僅供參考,gridview只是顯示用戶名。工作人員表將存儲密碼,datejoined字段..

順便說一句,我仍然需要連接表,因爲我已經添加了外鍵引用到表..我想它應該足夠聰明,以回報我User.Staff.Password


編輯
這是我發現.. 我添加了一些關係的外鍵到我的數據庫。 和下面的代碼已經能夠回到我的用戶和員工數據Staff.UserId指向用戶ID And i don have to use the TUPLE to return those object :)!!

public IEnumerable<User> Get() 
    { 
     using (ZebraDataContext db = new ZebraDataContext()) 
     { 
      try 
      { 
       var r = from u in db.Users 
         select u; 
         //join s in db.Staffs on u.Id equals s.UserId 
         //select new Tuple<User, Staff>(u, s); 

       return r.ToList(); 
      } 
      catch (Exception ex) 
      { 
       throw; 
      } 
     } 
    } 

但是,我有麻煩時,我綁定到GUI datagridview的。

private void InitializeData() 
    { 
     gvUser.DataSource = user.Get(); 
    } 

此代碼能夠顯示我的用戶數據。但是當我做gvUser_RowEnter時,我該如何找回員工數據?

私人無效gvUser_RowEnter(對象發件人,DataGridViewCellEventArgs E) { 如果(e.RowIndex < = 0)返回;

 foreach (DataGridViewRow row in gvUser.SelectedRows) 
     { 
      User user = row.DataBoundItem as User; 
      txtName.Text = user.Name; 
      txtAddress.Text = user.Address; 
      txtPhone.Text = user.Phone; 
      txtPhone2.Text = user.Phone2; 
      txtRemark.Text = user.Remarks; 

      txtPassword.Text = user.Staffs.First().Password; 

     } 
    } 

txtPassword.text = user.Staffs.First().Password < ==失敗,這個錯誤 無法訪問已釋放的對象。 對象名稱:'在Dispose之後訪問DataContext'。

當我添加監視用戶中的Staff對象。我可以看到隱藏的數據 ((User)(row.DataBoundItem))。Staffs.entities.Items this have the staff data ..

回答

3

而不是返回一個Tuple,不會返回一個匿名對象的伎倆?它可能看起來像這樣:

var r = from u in db.Users 
    select new { u.Name, 
       u.Address, 
       ..., 
       (from s in db.Staffs select s.Password where u.Id == s.UserId) 
       };