2017-08-02 162 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