Entity Framework эквивалентно следующему запросу? - PullRequest
0 голосов
/ 10 декабря 2018

Может кто-нибудь сказать мне, как написать запрос 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 голосов
/ 10 декабря 2018

Длинный ответ:

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 
    });

Краткий ответ: используйте хранимую процедуру.

...