2017-08-02 189 views
-3

我有这个linq代码,我需要将它转换成相同的SQL,因此我可以直接查询数据库...当它变得复杂时,我会卡住。谁能帮忙?将此Linq转换为SQL

的LINQ

_db.BatchPaymentSplits 
    .Where(bps => bps.YearSetupId == i.YearSetupId) 
    .Where(bps => bps.CustomerIdEntered != null) 
    .Where(bps => _db.BatchPayments 
     .Where(bp => _db.Batches.Where(b => b.BatchTypeId.Equals("T")) 
           .Select(b => b.BatchId) 
           .Contains(bp.BatchId) 
     ) 
     .Select(bp => bp.BatchPaymentId).Contains(bps.BatchPaymentId) 
    ) 

SQL至今

SELECT * FROM BatchPaymentSplit 
WHERE YearSetupId = 1 
AND CustomerIdEntered IS NOT NULL 
+2

EF会告诉你它正在生成的SQL,我建议你使用它而不是在这里问。 – DavidG

+0

它会吗?我可以使用中断点看到它吗? – CheezStix

+0

谷歌是你的朋友...只是做'.ToString()'是一个谷歌是你的朋友... https://stackoverflow.com/questions/1412863/how-do-i-view-the-sql-generated-by-the-entity-framework – DavidG

回答

1

我不能说,我认为LINQ或生成的SQL是表达此查询的最佳方式(应我认为使用Join),但这是我的直译:

SELECT * 
FROM BatchPaymentSplits bps 
WHERE bps.YearSetupId = i.YearSetupId AND 
     bps.CustomerIdEntered IS NOT NULL AND 
     EXISTS (SELECT * FROM BatchPayments bp 
       WHERE EXISTS (SELECT * FROM Batches b 
          WHERE b.BatchTypeId = 'T' AND 
            b.BatchId = bp.BatchId) AND 
        bp.BatchPaymentId = bps.BatchPaymentId) 

当作为EXISTS查询与=表达式应用于IEnumerable/IQueryable可以转换Contains