Многие для многих и Linq: обновление отношений - PullRequest
3 голосов
/ 03 ноября 2010

Итак, у меня есть три таблицы (ну, 2 таблицы и 1 таблица сопоставления) следующим образом:

dbo.Catalog
    CatalogID // int [not null] autoincrement PK
dbo.Product
    ProductID // int [not null] autoincrement PK
dbo.CatalogProductMap
    CatalogID // int [not null] PK
    ProductID // int [not null] PK

У меня есть флажки на странице для обновления Product примерно так:

<% foreach(var catalog in dataContext.Catalogs){ %>
    <!-- add a checkbox for each catalog  -->
    <input type="checkbox" name="catalog[<%= catalog.CatalogID %>]" />
<% } %>

В моем коде для обработки POST у меня есть:

 // Regex to check Form keys and group each ID
 var rCatalog = new Regex("^catalog\\[(\\d+)\\]$");
 // gets all "checked" CatalogIDs POSTed
 IEnumerable<int> checkedCatalogs =
            Request.Form.AllKeys
                   // get only the matching keys...
                   .Where(k => rCatalog.IsMatch(k))
                   // and select the ID portion of those keys...
                   .Select(c => int.Parse(rCatalog.Match(c).Groups[1].Value));

А потом эта вонючая часть:

ОБНОВЛЕНО!

Спасибо Дейву Сверски за Any<> метод

Product Product = getProductBeingUpdated();

// iterate through each EXISTING relationship for this product
// and REMOVE it if necessary.
myDataContext.CatalogProductMaps
    .DeleteAllOnSubmit(from map in Product.CatalogProductMaps
        where !checkCatalogs.Contains(map.CatalogID)
        select map);

// iterate through each UPDATED relationship for this product
// and ADD it if necessary.
Product.CatalogProductMaps
    .AddRange(from catalogID in checkedCatalogs
        where !Product.CatalogProductMaps.Any(m => m.CatalogID == catalogID)
        select new Group{
            CatalogID = catalogID
    });


myDataContect.SubmitChanges();

Так что мой вопрос:

Это не можетбыть правильным способом для достижения того, что я делаю.Как я могу улучшить код для удобства обслуживания (и эффективности)?

1 Ответ

1 голос
/ 03 ноября 2010

Процесс удаления выглядит хорошо для меня, но проверка на наличие проверенных Продуктов может быть сделана более эффективной, используя Any() вместо Where():

if(Product.CatalogProductMap.Any(g => g.CatalogID == catalogID))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...