Linq中子查询的有效方法

时间:2011-11-18 14:11:43

标签: c# database entity-framework-4 linq-to-entities

这是我的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

为什么会这样?有没有解决方法?

4 个答案:

答案 0 :(得分:2)

您的SQL正在使用连接,因此您可以在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();

答案 1 :(得分:1)

s.ID正在与Enumerable进行比较,因此您会收到错误 在LINQ查询结束时,添加SingleOrDefault()。

答案 2 :(得分:1)

您的子查询返回一系列值,而不是单个值,因此您无法将其与标ID之类的标量属性进行比较。您应该在子查询的结果上使用First来获取第一个结果(如果只有一个结果,则应使用Single

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());

答案 3 :(得分:0)

您应该可以使用BOOKS类上的导航属性执行以下操作:

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