LINQ вернуться с помощью Tuple - PullRequest
5 голосов
/ 09 марта 2011

привет, я только что обновился до Framework 4.0 и добавил внешний ключ отношений в свою базу данных. Я хотел бы присоединиться к таблице 2 User and Staff и вернуться обратно в пользовательский интерфейс. Таблица персонала имеет идентификатор пользователя. Надо сказать, что всякий раз, когда имя пользователя нажимается на сетке данных, я хотел бы отобразить данные о пользователе и персонале для всего текстового поля.

Я делаю это, используя 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;
            }
        }
    }

Но в интерфейсе, как мне сделать привязку? gvUser.DataSource = user.Get();

К вашему сведению, в gridview просто отображается имя пользователя. В таблице персонала будут храниться пароли, поля с датами.

Кстати, мне все еще нужно объединять таблицы, поскольку я уже добавил ссылку на внешний ключ к таблицам ... Я думаю, она должна быть достаточно умной, чтобы вернуть мне User.Staff.Password


EDIT
это то, что я нашел .. Я добавил внешний ключ отношения в свою базу данных. и приведенный ниже код уже может вернуть мне данные о пользователе и персонале, поскольку 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;
            }
        }
    }

Однако у меня возникают проблемы при привязке к сетевому представлению данных графического интерфейса.

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

Этот код может показывать мне данные пользователя. Но как мне вернуть данные о персонале, когда я делаю gvUser_RowEnter?

private void gvUser_RowEnter (отправитель объекта, DataGridViewCellEventArgs e) { if (e.RowIndex <= 0) return; </p>

        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, доступ к которому осуществляется после удаления.». </p>

когда я добавляю смотреть объект Staff в User. я могу видеть данные в скрытом ((Пользователь) (row.DataBoundItem)). Staffs.entities.Itms это содержит данные персонала ..

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

Вместо возврата 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 голос
/ 09 марта 2011

Если вы хотите связать сложные типы, вы должны подумать о DescriptorProviders.Вот несколько похожих примеров http://www.ureader.com/msg/14411105.aspx.

...