这是我的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 :(得分: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)