/ / Eficiente maneira de subconsultas em Linq - c #, banco de dados, entidade - estrutura - 4, linq - para - entidades

Maneira eficiente de subconsultas em Linq - c #, banco de dados, entidade - estrutura - 4, linq - para - entidades

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 № 1

Seu 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)