用特殊条件把林克的两张桌子连起来



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

tbl艺术:身份证件CartID,条形码,

和tblOrderDetail:身份证件CartID,IsCompleted条形码

当有人保存订单时,在他确认他的请求之前,一行临时进入tblArt,如果他或她确认了他的请求,那么另一行将被插入tblOrderDetail,

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

换句话说,如果tblArt中有cartID=1的行,同时tblOrderDetail中也有cartID=1的同一行,那么我不想要该行。

总而言之,只有tblOrderDetail中没有的行,实现这一点的字段是CartID,我应该提到的是,我使Iscomplete=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

有了这些数据,它应该只显示tblArt中的最后两行,我的意思是

ID=2
CartID=1214
Barcode=4567
ID=3
CartID=1215
Barcode=6576

这听起来像是sql中WHERE NOT EXISTS的情况。

大致翻译一下,在LINQ:中应该是这样的

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

如果您在cart上有一个导航属性来引用详细信息(我假设它被称为Details),那么:

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

最新更新