LINQ使用Tuple返回结果

5

你好,我刚刚升级到Framework 4.0,并在我的数据库中添加了关系外键。 我想连接两个表User和Staff并返回到UI。 Staff表具有UserId。 需要注意的是,每当在datagridview上单击用户名时,我都希望将User和Staff数据显示到所有文本框中。

我使用元组来完成此操作。

   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只显示用户名。员工表将存储密码、加入日期等字段。

另外,由于我已经向表中添加了外键引用,所以我是否仍需要连接表?我认为它应该足够智能,可以返回User.Staff.Password。


编辑
这就是我找到的... 我已经向我的数据库添加了关系外键。 下面的代码已经能够将User和Staff数据作为Staff.UserId指向UserId而返回给我了。 我不必使用TUPLE来返回那些对象:)!

 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数据网格时遇到了问题。

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

这段代码可以展示用户数据。但是当我执行 gvUser_RowEnter 时,如何获取回员工数据呢?

private void gvUser_RowEnter(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex <= 0) return;

        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 出现了以下错误:无法访问已释放的对象。对象名称:"DataContext accessed after Dispose."。

当我在User中添加Watch Staff对象时,我可以看到隐藏的数据((User)(row.DataBoundItem)).Staffs.entities.Items,其中包含员工数据。

2个回答

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

谢谢回复,但我更喜欢不使用第三方库。 - VeecoTech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接