Прежде всего я должен признать, что я очень новичок в выражениях Linq и Lambda.Я пытаюсь получить следующий оператор SQL в оператор Linq (используя выражения lamda):
select *
from dbo.tblStockTransfers t1,
dbo.tblSuppliers t2
where t1.SupplierID = t2.SupplierID
and t2.WarehouseID in (1,2,3)
and t1.GoodsPickedUp = 1
and Not exists
(select 1 from dbo.tblStockTransfers t3
where t3.TransferOutID = t1.TransferID and t3.TransferConfirm = 1)
Мой класс StockTransfer является агрегатным корнем и имеет свой собственный репозиторий.Пока что я получил следующее (переменная allowWarehouses содержит список идентификаторов хранилища):
Return GetObjectSet().Where(Function(st) allowedWarehouses.Contains(st.Supplier.WarehouseID) And st.GoodsPickedUp = True)
Это прекрасно работает, но, очевидно, отсутствует часть "и не существует ..." (последние 3строки кода SQL в верхней части этой публикации).Я знаю, что в Linq нет «не существует», но вы можете использовать метод «Любой» для этого.Вот рабочий пример этого в другом месте в моем коде:
Return GetObjectSet().Where(Function(sw) sw.Active = True And Not sw.Suppliers.Any(Function(sp) sp.WarehouseID = sw.Id))
Это прекрасно работает и даст мне любые склады, которые еще не связаны с поставщиком.Как вы можете видеть в приведенном выше примере, это нормально, поскольку я имею в виду связанную таблицу «Поставщики».
Однако в коде SQL, который я сейчас пытаюсь преобразовать в Linq, «не существует»"не на связанной таблице, а на себе.Есть ли способ, которым я могу создать 2-ю ссылку на основную таблицу и использовать ее в части ".. not ..any".Может быть что-то вроде:
Return GetObjectSet().Where(Function(st) allowedWarehouses.Contains(st.Supplier.WarehouseID) And st.GoodsPickedUp = True And Not st2.Any(st2.TransferOutID = st.TransferId and st2.TransferConfirm = true)
Но я не знаю, как определить st2 (т.е. в этом случае st2 будет вторым псевдонимом StockTransfer).Любая помощь будет принята с благодарностью.