【问题标题】:linq return using Tuplelinq 使用元组返回
【发布时间】:2011-03-09 09:48:13
【问题描述】:

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

我使用元组来做这个

   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


编辑
这是我发现的。。 我已将关系外键添加到我的数据库中。 并且下面的代码已经能够返回我的用户和员工数据,因为 Staff.UserId 指向 UserId 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

        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

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

【问题讨论】:

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


    【解决方案1】:

    与其返回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) 
                   };
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的回复,但我希望不要使用第三方库
      猜你喜欢
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多