实体框架是否等同于以下查询?

时间:2018-12-10 19:08:58

标签: c# .net entity-framework tsql ado

有人可以告诉我如何编写与此等效的EF查询:

SELECT OI.orderid, 
       OI.inventoryid, 
       VP.vendorid 
FROM   orders O 
       INNER JOIN orderitems OI 
               ON O.orderid = OI.orderid 
       INNER JOIN vendorparts VP 
               ON VP.inventoryid = OI.inventoryid 
WHERE  (SELECT Count(*) 
        FROM   vendorparts 
               INNER JOIN vendors 
                       ON vendorparts.vendorid = vendors.vendorid 
                          AND vendors.candropship = 1 
        WHERE  vendorparts.inventoryid = VP.inventoryid 
               AND vendorparts.vendorid IN ( 1, 17 )) > 1 

我正在尝试做这样的事情...

var q = from o in _context.Orders
            join oi in _context.Orderitems on o.Orderid equals oi.Orderid
            join vp in _context.Vendorparts on oi.Inventoryid equals  vp.Inventoryid
                where (from vp2 in _context.Vendorparts
                       where vp2.Inventoryid == vp.Inventoryid                           
                       select count(*)) > 1

但显然在语法上不允许这样做。

1 个答案:

答案 0 :(得分:0)

长答案:

var vendorIds = new int[] { 1, 17 };

_context
    .Orders
    .Join(_context.Orderitems,
        o => o.Orderid,
        oi => oi.Orderid,
        (o, oi) => new { o, oi })
    .Join(_context.Vendorparts,
        o_oi => o_oi.oi.Inventoryid,
        vp => vp.Inventoryid,
        (o_oi, vp) => new { o_oi.o, o_oi.oi, vp })
    .Where(o_oi_vp => _context.Vendorparts
        .Where(vp
            => vp.Inventoryid == o_oi_vp.vp.Inventoryid
            && vendorIds.Contains(vp.Vendorid))
        .Join(_context.Vendors.Where(v => v.Candropship),
            vp => vp.Vendorid,        
            v => v.Vendorid,
            (vp, v) => new { vp, v })
        .Any())
    .Select(o_oi_vp => new {
        o_oi_vp.oi.orderid, 
        o_oi_vp.oi.inventoryid, 
        o_oi_vp.vp.vendorid 
    });

简短的答案:使用存储过程。