2015-01-08 4 views
0

У меня есть CheckedListbox, который содержит значения из таблицы, называемой продуктом. Идея состоит в проверке продуктов, связанных с клиентом. Теперь он корректно сохраняет таблицу ссылок, но при повторной загрузке элементы, которые были проверены, не загружаются правильно в CheckedListbox.Получить текущие первичные ключи из таблицы ссылок, установить контрольный список Checkstate

Итак, из этой таблицы ссылок, где я хотел бы получить все строки из одного столбца. Все таблицы уже загружены в приложение, поэтому я не хочу использовать sql.

Я пробовал использовать linq, без каких-либо успехов, идентификаторы здесь просто пусты.

int[] Ids = (from m in dataset.Tables["LinkTable"].AsEnumerable() 
       where m.Field<int>("customerId") == customerId 
       select m.Field<int>("productId")).ToArray(); 

Тогда, если я не удастся получить эти идентификаторы, я хотел бы получить индексы этих первичных ключей, так что я могу установить правильные продукты для checked. Я устал делать это так, но это дает мне ошибку в других частях программы, потому что я устанавливаю ключ Primary для глобального datatable. Datagridviews не нравится.

 DataColumn[] keyColumns = new DataColumn[1]; 
     keyColumns[0] = dataset.Tables["products"].Columns["Id"]; 
     currentPatient.GetTheDataSet.Tables["products"].PrimaryKey = keyColumns; 

     foreach (int Id in Ids) 
     { 
      DataRow row = dataset.Tables["Products"].Rows.Find(Id); 
      int index = dataset.Tables["Products"].Rows.IndexOf(row); 
      clbMedications.SetItemChecked(index, true); 

     } 

Я хотел бы сделать, что последняя часть без указания первичного ключа, я не мог найти, как это сделать в LINQ.

Я знаю, что он состоит из 2 вопросов, но, возможно, это может быть сделано только с одним выражением linq, чтобы я лучше их сочетал.

+0

Является ли ** customerId ** определенным? –

+0

Да, при загрузке данных от определенного клиента объект заполняется наборами данных и текущим клиентом, поэтому я могу легко использовать его в других запросах. – CularBytes

ответ

1

[EDIT]

Наконец, я думаю, что я получил то, что вам нужно:

var qry = (from p in ds.Tables["products"].AsEnumerable() 
    select new { 
     Id = p.Field<int>("Id"), 
     Index = ds.Tables["products"].Rows.IndexOf(p), 
     Checked = ds.Tables["LinkTable"].AsEnumerable().Any(x=>x.Field<int>("productId") == p.Field<int>("Id") && x.Field<int>("customerId")==customerid) 
    }).ToList(); 

Выше запроса возвращает список, который вы можете bnid с CheckedListBox.

+0

Я понимаю его до тех пор, пока не будет часть 'select new', создаете ли вы там новые переменные? c.CustomerName, например, не существует ... Тип нового для linq, как вы, вероятно, уже узнали – CularBytes

+0

Тогда я до сих пор не знаю, как я могу использовать этот var для моего решения. – CularBytes

+0

Это просто пример ... Я хотел показать вам, что вы можете объединить данные в один результирующий набор. Если вы хотите получить * productid * from ** LinkTable **, то для получения индекса * productid *, то использование join's - это способ решить вашу проблему. –