Важный момент - то, что хвостовая рекурсия чрезвычайно эквивалентна цикличному выполнению. Это не просто вопрос компиляторной оптимизации, но и фундаментальный факт о выразительности. Это идет обоими путями: можно взять любой цикл формы
while(E) { S }; return Q
, где E
и Q
выражения, и S
последовательность операторов, и превратите, это в рекурсивную функцию
f() = if E then { S; return f() } else { return Q }
хвоста, Конечно, E
, S
, и Q
должно быть определено для вычисления некоторого интересного значения по некоторым переменным. Например, функция цикличного выполнения
sum(n) {
int i = 1, k = 0;
while( i <= n ) {
k += i;
++i;
}
return k;
}
эквивалентна рекурсивной функции (функциям) хвоста
sum_aux(n,i,k) {
if( i <= n ) {
return sum_aux(n,i+1,k+i);
} else {
return k;
}
}
sum(n) {
return sum_aux(n,1,0);
}
(Это "обертывание" рекурсивной функции хвоста с функцией с меньшим количеством параметров является общей функциональной идиомой.)
Предполагая CategoryProduct
таблица просто состоит из двух FK: один для Product
и один для Category
... EF по умолчанию не будет создавать объект CategoryProduct
, вместо этого для управления в этой таблице вам нужно будет создать / удалить отношения с помощью коллекций Product.Categories
или Category.Products
.
То есть, чтобы добавить строку:
product.Categories.Add(category); // or category.Products.Add(product);
Чтобы удалить строку:
product.Categories.Remove(category); // or visa versa
Запросить таблицу, т.е. получить строки в этой таблице:
var pc = from c in ctx.Categories
from p in c.Products
select new {CategoryID = c.ID, ProductID = p.ID};
И обновление не имеет смысла, потому что PK (который не может измениться) - это все столбцы, т.е. ни один из столбцов строки не может быть обновлен , поэтому сама строка не может быть обновлена (за исключением, конечно, удалений).
Надеюсь, это поможет
Алекс Джеймс
Есть два способа, по крайней мере, два я могу подумайте о:
Вариант 2 - лучший способ, но в настоящее время имеет ограничение: если у вас есть другие данные, связанные с CategoryProduct, он не работает.