web-dev-qa-db-fra.com

Sélectionnez le premier résultat de la sous-requête de linq en sql

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.

here can be check quick watch result

15
rahularyansharma

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.

39