【发布时间】:2012-02-28 18:35:33
【问题描述】:
首先,我必须承认我是 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)
这工作正常,但显然缺少“并且不存在......”部分(这篇文章顶部的 SQL 代码的最后 3 行)。 我知道 Linq 没有“不存在”,但您可以为此使用“任何”方法。 这是我代码中其他地方的一个工作示例:
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 的第二个别名)。 任何帮助将不胜感激。
【问题讨论】:
标签: linq linq-to-sql lambda