在linq中加入两个具有特殊条件的表

时间:2016-07-29 14:36:47

标签: linq join lambda where-clause notin

我希望有人可以帮助我,我是linq的新手, 我有2个表名为tblcart和tblorderdetail: 我只是在这两个表中显示一些字段来显示我的问题:

tblCart: ID, CartID, 条形码

和tblOrderDetail: ID, CartID, 完成了 条形码

当有人保存订单时,在确认他的请求之前,一行暂时进入tblCart, 然后如果他或她确认了他的请求,则会在tblOrderDetail中插入另一行,

现在我想不显示插入tblOrderDetailed的行(仅显示tblCart中的临时行),

换句话说,如果tblCart中的行有cartID = 1且同时在tblOrderDetail中存在CartID = 1的同一行,那么我不想要那行。

总而言之,只是tblOrderDetail中没有的行,而实现这一点的字段是CartID, 我应该提一下,我使Iscompleted = true,并且我们可以排除我们不想要的行,

我这样做了:

var cartItems = context.tblCarts
    .Join(context.tblSiteOrderDetails, 
        w => w.CartID, 
        orderDetail => orderDetail.cartID,
        (w,orderDetail) => new{w,orderDetail})
    .Where(a=>a.orderDetail.cartID !=a.w.CartID)
    .ToList()
但是它没有用。

一个例子:

tblCart:
ID=1
CartID=1213
Barcode=4567

ID=2
CartID=1214
Barcode=4567

ID=3
CartID=1215
Barcode=6576

tblOrderDetail:
ID=2
CartID=1213
Barcode=4567
IsCompleted=true

使用这些数据它应该只显示tblCart中的最后两行,我的意思是

ID=2
CartID=1214
Barcode=4567

ID=3
CartID=1215
Barcode=6576

2 个答案:

答案 0 :(得分:0)

这听起来像sql中的WHERE NOT EXISTS

粗略翻译这应该是这样的LINQ:

var cartItems = context.tblCarts.Where(crt => !context.tblSiteOrderDetails.Any(od => od.CartID == crt.cartID));

答案 1 :(得分:0)

如果您在购物车上有导航属性以引用详细信息(我假设它被称为Details),那么:

var results=context.tblCarts.Where(c=>!c.Details.Any(d=>d.IsCompleted));
相关问题