2009-12-15 5 views
1

У меня есть пользовательский интерфейс, который предоставляет пользователю несколько флажков, и для каждого проверенного элемента мне нужно создать запись в таблице сопоставления.Сохранение вложенных объектов с помощью linq для объектов

LookupTable <- MapTable -> DataTable 

У меня есть пользовательское связующее вещество для DataTable, но не могу понять, как его создать для создания объектов MapTable.

Возможно ли это? Использование asp.net MVC 1.0 и LINQ для сущностей.

+0

Ваши теги и вопрос говорят L2E, но ваш заголовок говорит L2S. Эти два совершенно разные! –

+0

Вы правы - это L2E. Название обновлено. – chris

ответ

2

Вам необходимо позаботиться о двух шагах. (1) Добавьте вновь выбранные значения и (2) удалите невыделенные значения. Вам понадобится такой метод в вашем классе LookupTable.

public void SynchronizeDataTables(IEnumerable<DataTable> dataTables) 
{ 
    // get the current data tables. call ToList() to force and enumeration. 
    // without the ToList(), you'll get a "Sequence Changed during Enumeration" 
    // error 
    var currentDataTables = MapTable.Select(m => m.DataTable).ToList(); 

    // if the table is selected, but not in the data store add it. 
    foreach (var dataTable in dataTables) 
    { 
     if (!currentDataTables.Contains(dataTable)) 
     { 
      MapTables.Add(new MapTable { DataTable = dataTable }); 
     } 
    } 

    // if the table is in the data store, but not selected, then remove it. 
    foreach (var dataTable in currentDataTables) 
    { 
     if (!dataTables.Contains(dataTable)) 
     { 
      MapTables.Remove(dataTable); 
     } 
    } 
} 

Edit: Когда я сделал это, я был с помощью LINQ к SQL, и я ездил на велосипеде через только выбранных идентификаторов, а не всего объекта. Это сложнее, потому что LINQ-to-Entities создает несколько разные объекты, чем LINQ-to-SQL, потому что он не предоставляет идентификатор FK. Ниже приведены незначительные изменения:

public void SynchronizeDataTables(IEnumerable<int> dataTableIds) 
{ 
    // get the current data tables. call ToList() to force and enumeration. 
    // without the ToList(), you'll get a "Sequence Changed during Enumeration" 
    // error 
    var currentDataTableIds = MapTable.Select(m => m.DataTable.Id).ToList(); 

    // if the table is selected, but not in the data store add it. 
    foreach (var dataTableId in dataTableIds) 
    { 
     if (!currentDataTableIds.Contains(dataTableId)) 
     { 
      var dataTable = ???; // some method to fetch data table with ID = dataTableId 
      MapTables.Add(new MapTable { DataTable = dataTable }); 
     } 
    } 

    // if the table is in the data store, but not selected, then remove it. 
    foreach (var dataTable in currentDataTableIds) 
    { 
     if (!dataTableIds.Contains(dataTableId)) 
     { 
      var dataTable = ???; // some method to fetch data table with ID = dataTableId 
      MapTables.Remove(dataTable); 
     } 
    } 
} 
Смежные вопросы