2013-04-04 102 views
12

这里是我的SQL查询如下选择在LINQ子查询顶部1的结果为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

here can be check quick watch result

回答

31

代替Take(1)它返回序列IEnumerable<string>,使用FirstOrDefault()它返回单个字符串值(或空如果没有结果)。还没有为子查询结果创建匿名类型:

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

BTW FirstOrDefault()产生TOP(1) SQL。

+0

仍然显示在网格视图列{image_name = f55c1573_a658_420e_9d33_2a8d997bbd51.jpg}而不是f55c1573_a658_420e_9d33_2a8d997bbd51.jpg。我直接因为结果数据源的GridView – rahularyansharma 2013-04-04 12:16:33

+0

@rahularyansharma请参见小更新 - 这是因为你的子查询结果创建匿名类型:'新的{soh.image_name}'。你应该简单地返回字符串值。 – 2013-04-04 12:18:58

+1

谢谢!其作品 ! – rahularyansharma 2013-04-04 12:19:23