Voici ma requête SQL comme suit
select enq_Id,enq_FromName,
enq_EmailId,
enq_Phone,
enq_Subject,
enq_Message,
enq_EnquiryBy,
enq_Mode,
enq_Date,
ProductId,
(select top 1 image_name
from tblProductImage as i
where i.product_id=p.product_Id) as imageName,
p.product_Name,
p.product_code
from tblEnquiry as e
inner join tblProduct as p ON e.ProductId=p.product_Id
where ProductId is not null
Et j'essaie de convertir cette instruction sql en linq comme suit
var result = from e in db.tblEnquiries
join d in db.tblProducts
on e.ProductId equals d.product_Id
where e.ProductId != null
orderby e.enq_Date descending
select new {
e.enq_Id,
e.enq_FromName,
e.enq_EmailId,
e.enq_Phone,
e.enq_Subject,
e.enq_Message,
e.enq_EnquiryBy,
e.enq_Mode,
e.enq_Date,
d.product_Id,
d.product_Name,
imageName = (from soh in db.tblProductImages
where soh.product_id == e.ProductId
select new { soh.image_name }).Take(1)
};
Mais problème ça me donne imageName
dans une liste imbriquée mais je veux que imageName
juste comme une chaîne.
Je vérifie également en utilisant la surveillance rapide et dans l'image suivante, vous pouvez voir que imageName
apparaissant dans la liste intérieure.
Au lieu de Take(1)
qui retourne la séquence IEnumerable<string>
, Utilisez FirstOrDefault()
qui retourne une valeur de chaîne unique (ou null s'il n'y a aucun résultat). Ne créez pas non plus de type anonyme pour le résultat de la sous-requête:
imageName = (from soh in db.tblProductImages
where soh.product_id == e.ProductId
select soh.image_name).FirstOrDefault()
BTW FirstOrDefault()
génère TOP(1)
SQL.