【问题标题】:Select top 1 result from subquery in linq to sql从 linq 到 sql 中的子查询中选择前 1 个结果
【发布时间】:2013-04-05 13:35:58
【问题描述】:

这是我的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 出现在内部列表中。

【问题讨论】:

    标签: c# linq linq-to-sql


    【解决方案1】:

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

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

    顺便说一句,FirstOrDefault() 生成 TOP(1) SQL。

    【讨论】:

    • 仍然显示在网格视图列 { image_name = f55c1573_a658_420e_9d33_2a8d997bbd51.jpg } 而不是 f55c1573_a658_420e_9d33_2a8d997bbd51.jpg 。我直接将该结果提供给gridview的数据源
    • @rahularyansharma 请查看小更新 - 这是因为您为子查询结果创建了匿名类型:new { soh.image_name }。您应该简单地返回字符串值。
    • 请为我再做一件事,是否可以编辑我的问题标题,因为现在它看起来不像一般问题,可能只是看到标题而无法获得帮助。
    • @rahularyansharma 当然,没问题。顺便说一句,它是 Linq to SQL 还是 EF?
    • @rahularyansharma 我相信现在问题的格式很好:)
    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2011-06-10
    • 2017-11-18
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多