2013-04-04 10 views
12

hier SQL ist meine SQL-Abfrage alsWählen Sie Top-1 resultieren aus Unterabfrage in Linq

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 

folgen Und ich versuche, diese SQL-Anweisung in Linq zu konvertieren, wie

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) 
      }; 

Aber Problem folgt sein Geben Ich imageName in einer verschachtelten Liste, aber ich möchte, dass imageName nur als Zeichenfolge.

Ich überprüfe auch mit Quick Watch und in der folgenden Abbildung können Sie sehen, dass imageName in inneren Liste erscheint.

here can be check quick watch result

Antwort

31

Statt Take(1) die Sequenz kehrt IEnumerable<string> verwenden FirstOrDefault() die einzelne Zeichenfolge Wert zurückgibt (oder null, wenn keine Ergebnisse ist). Auch schaffen keine anonymen Typ für Unterabfrage Ergebnis:

imageName = (from soh in db.tblProductImages 
      where soh.product_id == e.ProductId 
      select soh.image_name).FirstOrDefault() 

BTW FirstOrDefault() erzeugt TOP(1) SQL.

+0

noch seine Shows in Rasteransicht Spalte {image_name = f55c1573_a658_420e_9d33_2a8d997bbd51.jpg} anstelle von f55c1573_a658_420e_9d33_2a8d997bbd51.jpg. Ich habe dieses Ergebnis direkt an die Datenquelle zu Gridview – rahularyansharma

+0

@rahularyansharma gegeben, siehe kleines Update - das war, weil Sie anonyme Art für Unterabfrage Ergebnis erstellt: 'new {soh.image_name}'. Sie sollten einfach einen String-Wert zurückgeben. –

+1

Danke! es funktioniert ! – rahularyansharma