aqui está o meu código 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));
Meu código oracle atual é:
SELECT DISTINCT BOOKS.ID
FROM LIBRARY,BOOKS
WHERE LIBRARY.ID = 123 AND LIBRARY.ID = BOOKS.ID
Mas está mostrando o erro no s.ID que ..
Delegate "System.Func Project.Models.BOOKS,int,bool" does not take 1 arguments
Por que isso acontece? Existem soluções alternativas?
Respostas:
2 para resposta № 1Seu SQL está usando uma junção, então você pode fazer a mesma coisa no LINQ. Qualquer uma dessas abordagens será suficiente:
// 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 para resposta № 2
s.ID está comparando com um Enumerable, então você obtém o erro.
No final da consulta LINQ, adicione um SingleOrDefault ().
1 para resposta № 3
Sua subconsulta retorna uma sequência de valores, não um único valor, então você não pode compará-la com uma propriedade escalar como ID
. Você deveria usar First
no resultado da subconsulta para obter o primeiro resultado (ou Single
se deveria haver apenas um)
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());
0 para a resposta № 4
Você deve poder usar as propriedades de navegação em sua classe BOOKS para fazer algo assim:
var bookIds = db.BOOKS.Where(b => b.LIBRARIES.Any(l => l.ID == 123))
.Select(b => b.ID)