24

これが私のSQLクエリです

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 

そして、次のようにこのSQLステートメントをlinqに変換しようとします

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

しかしimageName、ネストされたリストで私を与えてくれるという問題がありますが、私はそれをimageName単に文字列として欲しいのです。

imageName また、クイックウォッチを使用して確認すると、次の画像で内部リストに表示されていることがわかります。

ここでクイックウォッチの結果を確認できます

4

1 に答える 1

53

Take(1)which が sequence を返す代わりに、単一の文字列値 (または結果がない場合は null ) を返す which をIEnumerable<string>使用します。FirstOrDefault()また、サブクエリの結果に匿名型を作成しないでください。

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

ところで、SQLFirstOrDefault()を生成しTOP(1)ます。

于 2013-04-04T12:12:22.127 に答える