2012-04-09 222 views
0

這裏是我的SQL查詢如下:
你們能幫我把這個轉換成一個更乾淨嗎?如何將此SQL轉換爲LINQ或Lambda表達式?

SELECT [PurchaseRequestID], [ProjectID],[FullName] 
FROM PurchaseRequest 
    WHERE [PurchaseRequestID] IN 
    (SELECT [PurchaseRequestID] FROM PurchaseRequestDetail) 
    AND [PurchaseRequestID] NOT IN 
     (SELECT [PurchaseRequestID] FROM [PurchaseOrder]) 

雖然我已經將這筆successfuly,我認爲這是無法讀取,需要改寫:

var query = from a in db.PurchaseRequests 
where 
    (from b in db.PurchaseRequestDetails 
    select new 
    { 
     b.PurchaseRequestID 
    }).Contains(new { a.PurchaseRequestID }) && 
!(from c in db.PurchaseOrders 
    select new 
    { 
     c.PurchaseRequestID 
    }).Contains(new { a.PurchaseRequestID }) 
select a; 

感謝

+0

samantha07,我看到你是這個網站的新手。你有幾個下面的工作答案。如果您認爲其中一個是您的最佳答案,請將其標記爲正確,以便其他人可以查看您的工作方式。 – 2012-04-09 13:26:08

+0

所有的答案工作。太糟糕了,我只能選擇1.謝謝 – samantha07 2012-04-10 05:26:10

回答

1
var query = from a in db.PurchaseRequests 
where 
    db.PurchaseRequestDetails.Any(x => x.PurchaseRequestID == a.PurchaseRequestID) && 
    !db.PurchaseOrders.Any(x => x.PurchaseRequestID == a.PurchaseRequestID) 
select a; 
+0

Downvoter關心評論? – Magnus 2012-04-09 19:28:50

2

你真的不需要所有這些匿名對象。使用let關鍵字來引入臨時變量,而不是直接在子查詢上執行操作。

from a in db.PurchaseRequests 
let b = from b in db.PurchaseRequestDetails select b.PurchaseRequestID 
let c = from c in db.PurchaseOrders select c.PurchaseRequestID 
where b.Contains(a.PurchaseRequestID) && !c.contains(a.PurchaseRequestID) 
select a; 
+0

不能看到如何工作,因爲一個'PurchaseRequests'類型,b和c不是。 (可能是int) – Magnus 2012-04-09 13:07:38

+0

好的。我改變了它,所以它檢查'a.PurchaseRequestID'。現在它應該工作。接得好。 – 2012-04-09 13:09:34

0

如果您導航屬性設置,你可以寫這樣的查詢:

IQueryable<PurchaseRequest> query = 
    from purchaseRequest in myDataContext.PurchaseRequests 
    where purchaseRequest.PurchaseRequestDetail.Any() 
    where !purchaseRequest.PurchaseOrder.Any() 
    select purchaseRequest; 

或者如果你喜歡這個波長/法風格。

IQueryable<PurchaseRequest> query2 = myDataContext.PurchaseRequests 
    .Where(purchaseRequest => purchaseRequest.PurchaseRequestDetail.Any()) 
    .Where(purchaseRequest => !purchaseRequest.PurchaseOrder.Any());