You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定SQL查询转换为Entity Framework查询?

使用Entity Framework实现带聚合子查询的仓储层查询

原SQL查询

SELECT 
    ID, ACTION, BRAID, COMPID, CONFIGSTRDOCID, DESCRIPTION,  
    ITEMDOCSERID, QTYISFROMPACKREM, SOURCEDOCSERID, SOURCEITEMS, 
    SOURCESTATUSFROM, SOURCESTATUSPROC, SOURCESTATUSTO, STOREID, 
    USERIDS, 
    COUNT = (SELECT COUNT(*) FROM TRADES 
             WHERE DOCSERID = DEFINEDOCS.SOURCEDOCSERID 
               AND TRADES.STATUS = 0)  
FROM 
    DEFINEDOCS 
WHERE 
    (ACTION = 2) 
ORDER BY 
    DESC

实现步骤

1. 定义DTO类

因为需要返回包含自定义COUNT字段的结果,先创建一个DTO来承载查询输出:

public class DefinedocWithTradeCountDto
{
    public int ID { get; set; }
    public int ACTION { get; set; }
    public string BRAID { get; set; }
    public int COMPID { get; set; }
    public int CONFIGSTRDOCID { get; set; }
    public string DESCRIPTION { get; set; }
    public int ITEMDOCSERID { get; set; }
    public bool QTYISFROMPACKREM { get; set; }
    public int SOURCEDOCSERID { get; set; }
    public string SOURCEITEMS { get; set; }
    public int SOURCESTATUSFROM { get; set; }
    public int SOURCESTATUSPROC { get; set; }
    public int SOURCESTATUSTO { get; set; }
    public int STOREID { get; set; }
    public string USERIDS { get; set; }
    public int COUNT { get; set; }
}

2. 仓储层LINQ实现

在仓储类中编写对应的查询逻辑,EF会自动将LINQ转换为等价的SQL:

public IEnumerable<DefinedocWithTradeCountDto> GetDefinedocsWithTradeCount()
{
    // 假设你的DbContext实例为_dbContext
    var query = from definedoc in _dbContext.DEFINEDOCS
                where definedoc.ACTION == 2
                select new DefinedocWithTradeCountDto
                {
                    ID = definedoc.ID,
                    ACTION = definedoc.ACTION,
                    BRAID = definedoc.BRAID,
                    COMPID = definedoc.COMPID,
                    CONFIGSTRDOCID = definedoc.CONFIGSTRDOCID,
                    DESCRIPTION = definedoc.DESCRIPTION,
                    ITEMDOCSERID = definedoc.ITEMDOCSERID,
                    QTYISFROMPACKREM = definedoc.QTYISFROMPACKREM,
                    SOURCEDOCSERID = definedoc.SOURCEDOCSERID,
                    SOURCEITEMS = definedoc.SOURCEITEMS,
                    SOURCESTATUSFROM = definedoc.SOURCESTATUSFROM,
                    SOURCESTATUSPROC = definedoc.SOURCESTATUSPROC,
                    SOURCESTATUSTO = definedoc.SOURCESTATUSTO,
                    STOREID = definedoc.STOREID,
                    USERIDS = definedoc.USERIDS,
                    // 嵌入子查询实现COUNT统计
                    COUNT = _dbContext.TRADES
                        .Count(trade => trade.DOCSERID == definedoc.SOURCEDOCSERID && trade.STATUS == 0)
                };

    // 原SQL的ORDER BY缺少排序字段,这里示例按ID倒序,可根据实际需求调整
    return query.OrderByDescending(dto => dto.ID).ToList();
}

3. 可选优化:使用导航属性

如果你的实体类中已经定义了DEFINEDOCS和TRADES的关联导航属性(比如DEFINEDOCS有ICollection<TRADES> Trades),可以简化Count的写法:

COUNT = definedoc.Trades.Count(trade => trade.STATUS == 0)

EF会自动识别关联关系,生成和原SQL一致的查询语句。

内容的提问来源于stack exchange,提问作者Sotiris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:25:22