Как ссылаться на одну и ту же таблицу дважды? - PullRequest
0 голосов
/ 27 февраля 2012

Прежде всего я должен признать, что я очень новичок в выражениях 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).Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2012

Это не ответ на вопрос, но это обходной путь, который дает мне нужный мне результат:

        Dim st1 As List(Of StockTransfer) = GetObjectSet.Where(Function(st) allowedWarehouses.Contains(st.Supplier.WarehouseID) And st.GoodsPickedUp = True).ToList
        Dim st2 As List(Of StockTransfer) = GetObjectSet.Where(Function(st) st.TransferConfirm = True).ToList
        For Each st As StockTransfer In st2
            st1.RemoveAll(Function(x) x.Id = st.TransferOutID)
        Next
        Return st1

Я явно обманываю, разбивая запрос на 2 части, где каждая часть попадает в список, а затем я удаляю из списка 1 все элементы, которые у меня есть в списке 2 (удаляя те, которые обычно бывают игнорируется частью "не существует").

Тем не менее, я хотел бы услышать это, если кто-нибудь может придумать рабочее решение с использованием выражений Linq и лямбда-выражений (поскольку это немного похоже на чит).

0 голосов
/ 27 февраля 2012

Я бы сделал это примерно так:

Dim lsWareHouseIds As New List(Of Integer)() From {1,2,3}
dim obj= ( _ 
                From t1 in db.tblStockTransfers  _ 
                join t2 in db.tblSuppliers _ 
                    on t1.SupplierID equals company.SupplierID _
                where lsWareHouseIds.Contains(t2.WarehouseID) _ 
                andalso t1.GoodsPickedUp =1 _ 
                andalso Not _
                    (
                        from t3 in db.tblStockTransfers _ 
                        where t3.TransferConfirm=1 _ 
                        select t3.TransferOutID _ 
                    ).Contains(t1.TransferID) _ 
                select t1 _ 
             )

Я видел ваш комментарий и вы отвечаете.Разве вы не можете сделать это так:

GetObjectSet.Where(Function(st) _ 
allowedWarehouses.Contains(st.Supplier.WarehouseID) And st.GoodsPickedUp = True _ 
Andalso Not _ 
GetObjectSet.Where(Function(st) _ 
st.TransferConfirm = True).Any(Function(x) x.Id =  st.TransferOutID)).ToList
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...