从linq到sql中的子查询中选择前1个结果

rah*_*rma 15 c# linq linq-to-sql

这是我的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 
Run Code Online (Sandbox Code Playgroud)

我尝试将此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) 
             };
Run Code Online (Sandbox Code Playgroud)

但问题是它给了我imageName一个嵌套列表,但我希望它imageName只是一个字符串.

我还使用快速手表进行检查,在下面的图像中,您可以看到imageName 出现在内部列表中.

这里可以查看快速查看结果

Ser*_*kiy 39

而不是Take(1)返回序列IEnumerable<string>,使用FirstOrDefault()哪个返回单个字符串值(如果没有结果则返回null).也不要为子查询结果创建匿名类型:

imageName = (from soh in db.tblProductImages
             where soh.product_id == e.ProductId
             select soh.image_name).FirstOrDefault()
Run Code Online (Sandbox Code Playgroud)

BTW FirstOrDefault()生成TOP(1)SQL.

  • @rahularyansharma我相信现在问题格式很好:) (2认同)