Итак, у меня есть три таблицы (ну, 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();
Так что мой вопрос:
Это не можетбыть правильным способом для достижения того, что я делаю.Как я могу улучшить код для удобства обслуживания (и эффективности)?