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