2012-04-09 115 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()); 
相关问题