У меня есть таблица Product, которая использует UPC как часть первичного ключа.Все хорошо, пока продукт не имеет UPC, и рекомендуемый способ решить эту проблему - сгенерировать число между 8004 + идентификационный номер и 8005 + идентификационный номер.
Мне нужно сгенерировать уникальный UPC, еслиUPC равен нулю, находясь в транзакции, и затем сможет получать новые UPC только для продуктов, у которых в качестве значения UPC было ноль.
В SQL я мог бы сделать следующее:
insert into Product (ID, Name)
select min(pivotTable.value), 'New Product' as Name
from pivotTable
where not exists(
select null as nothing
from product
where pivotTable.value = product.ID ) and
pivotTable.value > 8004000000 and pivotTable.value < 8005000000
select id
from product
where Name = 'New Product' -- assuming Name is unique
Как бы я сделал это в Entity Framework 4 ?Отдельная проблема заключается в том, что это все в рамках одной транзакции, поэтому назначение номеров наборов отсутствующих UPC может назначить один и тот же UPC для всех новых продуктов.
РЕДАКТИРОВАТЬ:
В итоге я создалПредставление выглядит так, чтобы получить следующее наибольшее число, но EF не будет генерировать таблицу на диаграмме, потому что не может определить первичный ключ.Если я взломаю XML, он будет работать до тех пор, пока я не обновлюсь из базы данных, что стирает мои изменения.
Select min(ID), 'New Product' as Name
from ( select distinct ID
from product p1
where p1.ID > 8004000000 and p1.ID < 8005000000
union
select distinct coalesce( ID, 8004000000) as ID) A
left outer join
( select distinct ID
from product p2
where p2.ID > 8004000000 and p2.ID < 8005000000
union
select distinct coalesce( ID, 8004000000) as ID) B
on A.ID + 1 = B.ID
where B.ID is null
Так что вопрос такой же: Как вы могли бы генерировать наименьшее наибольшее доступное число в Entity Framework4 , т. Е. Как вы могли бы переписать SQL-запрос, указанный выше, в Linq to Entities, или как вы могли бы показать представление на диаграмме Entity Framework 4 без редактирования файла XML, который отбрасывает ваши изменения при обновлении?
РЕДАКТИРОВАТЬ: кажется, генерирует следующий доступный с помощью Linq:
// Setup our ID list
var prod = DC.Products.Where(p => p.ID > 0 && p.ID < 1000)
.Select(p => p.ID).Distinct();
// Compare the list against itself, offset by 1. Look for "nulls"
// which represent "next highest number doesn't exist"
var q = (from p1 in prod
from p2 in prod.Where(a => a == p1 + 1).DefaultIfEmpty() // Left join
where p2 == 0 // zero is null in this case
select p1).Min();
var r = q + 1; // one higher than current didn't exist, so that's the answer