/ / Un moyen efficace de sous-requêtes dans Linq - c #, base de données, framework-entité-4, linq-to-entity

Moyen efficace de sous-requêtes dans Linq - c #, base de données, entité-framework-4, linq-to-Entités

voici mon code 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));

Mon code Oracle réel est:

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

Mais son montrant l'erreur dans le sID que ..

Delegate "System.Func Project.Models.BOOKS,int,bool" does not take 1 arguments

Pourquoi cela arrive-t-il? Existe-t-il des solutions de contournement?

Réponses:

2 pour la réponse № 1

Votre SQL utilise une jointure, vous pouvez donc faire la même chose dans LINQ. L'une ou l'autre de ces approches suffira:

// 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 pour la réponse № 2

s.ID se compare à un Enumerable, vous obtenez donc l'erreur.
À la fin de la requête LINQ, ajoutez un SingleOrDefault ().


1 pour la réponse № 3

Votre sous-requête renvoie une séquence de valeurs, pas une seule valeur, vous ne pouvez donc pas la comparer à une propriété scalaire comme ID. Tu devrais utiliser First sur le résultat de la sous-requête pour obtenir le premier résultat (ou Single s'il n'y en a qu'un)

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 pour la réponse № 4

Vous devriez pouvoir utiliser les propriétés de navigation de votre classe BOOKS pour faire quelque chose comme ceci:

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