首先,我不得不承认,我是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是一个聚合根,有它自己的仓库。 现在为止我得到了以下(可变allowedWarehouses包含仓库ID列表):
Return GetObjectSet().Where(Function(st) allowedWarehouses.Contains(st.Supplier.WarehouseID) And st.GoodsPickedUp = True)
这工作得很好,但很明显是缺少“不存在......”部分(最后3行本帖顶部的SQL代码)。 我知道Linq没有“不存在”,但是你可以使用“Any”方法。 下面是这个其他地方在我的代码的工作示例:
Return GetObjectSet().Where(Function(sw) sw.Active = True And Not sw.Suppliers.Any(Function(sp) sp.WarehouseID = sw.Id))
这工作得很好,并给我未链接到供应商还没有任何仓库。 正如你可以在上面的例子中看到的那样,因为我指的是相关的表“供应商”。
但是,在我正试图转换为Linq的SQL代码中,“不存在”不在链接表上,而是在本身上。有没有办法可以在主表上创建第二个引用,并在“.. 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)。 任何帮助将不胜感激。
Arion,谢谢你的回答。我没有尝试过,但我可以看到这会起作用。但天哪,这是很多代码。这就是为什么我试图让它使用lambda表达式工作。看看我几分钟前发布的答案。这显然不是真正的答案,而是一种解决方法,它使我获得正确的结果。 – Peter 2012-02-28 09:23:32
更新了答案 – Arion 2012-02-28 10:35:43