2011-11-18 69 views
3

这里是我的LINQ代码:在LINQ的子查询的高效方式

BOOK entity = db.BOOKS 
      .Where(s => s.ID == (from p in db.LIBRARY 
            from b in db.BOOKS 
            where (p.ID == 123) && (p.idpage == b.idpage) 
            select b.fields)); 

我实际的Oracle代码:

SELECT DISTINCT BOOKS.ID 
FROM LIBRARY,BOOKS 
WHERE LIBRARY.ID = 123 AND LIBRARY.ID = BOOKS.ID 

但它显示出..

在s.ID错误
Delegate 'System.Func Project.Models.BOOKS,int,bool' does not take 1 arguments 

这是为什么发生?有没有解决方法?

+0

Sry guys。我没有提到abt删除操作。现在我编辑清楚。谢谢 –

回答

0

您应该能够使用导航属性上你的书类,做这样的事情:

var bookIds = db.BOOKS.Where(b => b.LIBRARIES.Any(l => l.ID == 123)) 
    .Select(b => b.ID) 
1

s.ID是比较可枚举,所以你的错误。
在LINQ查询的末尾,添加一个SingleOrDefault()。

1

您的子查询返回一个值序列,而不是单个值,因此您无法将其与标量属性(如ID)进行比较。

BOOK entity = db.BOOKS 
      .Where(s => s.ID == (from p in db.LIBRARY 
            from b in db.BOOKS 
            where (p.ID == 123) && (p.idpage == b.idpage) 
            select b.fields).First()); 
2

你的SQL使用加入您应该使用First的子查询的结果来获得的第一个结果(或Single如果有应该只有一个),所以你可以做同样的事情在LINQ。这些方法都可以满足:

// join 
var query = (from b in db.BOOKS 
      join p in db.LIBRARY on b.IdPage equals p.IdPage 
      where p.ID == 123 
      select b.Id).Distinct(); 

// 2 from statements (SelectMany) can also be used as a join 
var query = (from b in db.BOOKS 
      from p in db.LIBRARY 
      where p.ID == 123 && b.IdPage == p.IdPage 
      select b.Id).Distinct(); 

// fluent syntax 
var query = db.BOOKS 
       .Where(b => db.LIBRARY.Any(p => 
        p.ID == 123 && b.IdPage == p.IdPage)) 
       .Select(b => b.Id) 
       .Distinct();