linq使用Tuple返回

时间:2011-03-09 09:48:13

标签: c# visual-studio-2010 linq-to-sql c#-4.0

您刚刚升级到Framework 4.0并将关系外键添加到我的数据库中。我想加入2表User and Staff并返回UI。员工表具有UserId。不得不说,每当在datagridview上点击用户名时,我想向所有文本框显示用户和员工数据。

我使用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指向UserId时,下面的代码已经能够返回User和Staff数据 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时,如何取回员工数据?

private void gvUser_RowEnter(object sender,DataGridViewCellEventArgs e)         {             if(e.RowIndex&lt; = 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&lt; ==此错误失败 无法访问已处置的对象。 对象名:'Dispose后访问的DataContext。'。

当我在User中添加监视Staff对象时。我可以看到隐藏的数据 ((User)(row.DataBoundItem))。Staffs.entities.Items这有人员数据..

2 个答案:

答案 0 :(得分: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) 
               };

答案 1 :(得分:1)

如果你想绑定复杂类型,你应该考虑DescriptorProviders。这是一些类似的例子http://www.ureader.com/msg/14411105.aspx