C# 简洁的嵌套对象查询-未填充所有属性

C# 简洁的嵌套对象查询-未填充所有属性,c#,linq,dapper,C#,Linq,Dapper,我试图用Dapper.NET将一个简单的结果集返回到一个嵌套对象中(EmergingIssue包含Reason和Status对象),但查询并没有填充所有列。见下文POCOs: public class EmergingIssue { public string Category; public string Brand; public string Sku; public string SkuDesc; public string Manufacturin

我试图用Dapper.NET将一个简单的结果集返回到一个嵌套对象中(EmergingIssue包含Reason和Status对象),但查询并没有填充所有列。见下文POCOs:

public class EmergingIssue
{
    public string Category;
    public string Brand;
    public string Sku;
    public string SkuDesc;
    public string ManufacturingSite;
    public double? CurrentAvailableWfc;
    public Reason Reason;
    public Status Status;
    public double? TargetWfc;
    public DateTime? DateItemAdded;
    public string UserComment;
    public string PlannerID;
}

public class Reason
{
    public int ReasonId;
    public string ReasonDesc;
}

public class Status
{
    public int StatusId;
    public string StatusDesc;
}
下面是我试图将结果集投影到EmergingIssue类的代码(采用了类似的StackOverflow问题):

publicstaticlist GetEmergingIssues()
{
使用(var conn=neworacleconnection(Constant.DatabaseConnection()))
{
conn.Open();
StringBuilder sql=新的StringBuilder();
sql.Append(“选择ei.CATEGORY、ei.BRAND、ei.SKU、ei.SKU_DESC SkuDesc”);
sql.Append(“,制造地点制造地点,当前可用的WFC当前可用的WFC”);
sql.Append(“,ei.TARGET\u WFC TargetWFC”);
sql.Append(“,ei.DATE\u ITEM\u ADDED dateitem ADDED”);
追加(“,ei.USER\u COMMENT UserComment”);
sql.Append(“,ei.PLANNER\u ID PlannerID”);
追加(“,ei.REASON\u ID ReasonID,r.REASON\u DESC ReasonDesc”);
sql.Append(“,ei.STATUS\u ID StatusID,s.STATUS\u DESC StatusDesc”);
sql.Append(“来自新兴发行的ei”);
追加(“左外部连接出现问题状态在s.STATUS\U ID=ei.STATUS\U ID上”);
Append(“r.REASON\u ID=ei.REASON\u ID上的左外部联接合并\u问题\u原因r”);
List emergingIssues=conn.Query(sql.ToString(),
(ei、r、s)=>
{
原因=r;
ei.状态=s;
返回ei;
},
splitOn:“ReasonID,StatusID”).ToList();
回归问题;
}
}
此结果返回多个字段,但未填充UserComment、PlannerID、DateItemAdded和其他几个字段。显然,问题在于投影数据的Linq函数,但我对语法不够熟悉,无法理解如何解决它

此外,是否有宝贵的Linq资源用于学习更高级的功能?例如,我经常使用
。其中(x=>x.StringValue==“Test”)
(以及其他类似的简单功能),但我不经常像上面尝试的那样传递函数。

问题在于:

splitOn:“ReasonID,StatusID”


您不能在
splitOn
字符串中添加任何空格,因为Dapper只需用逗号分割该字符串-它将查找名为
“StatusId”
(开头有空格)

的列,而不是使用
StringBuilder
创建查询,为什么不尝试使用
SqlBuilder
类呢。在我看来,它将为您提供更具可读性的查询创建


我还发现这个家伙,创造了一个伟大的扩展

这是因为select语句中的列顺序与splitOn不同,因此Dapper返回null。我通过结合您和@Matija提供的答案解决了这个问题。主要问题是splitOn根据拆分数据将对象分块在一起,列顺序不正确。我已经用新的SQL更新了原始问题。
public static List<EmergingIssue> GetEmergingIssues()
{
    using (var conn = new OracleConnection(Constant.DatabaseConnection()))
    {
        conn.Open();
        StringBuilder sql = new StringBuilder();

        sql.Append("SELECT ei.CATEGORY, ei.BRAND, ei.SKU, ei.SKU_DESC SkuDesc");
        sql.Append(" ,MANUFACTURING_SITE ManufacturingSite, CURRENT_AVAILABLE_WFC CurrentAvailableWfc");
        sql.Append(" ,ei.TARGET_WFC TargetWFC");
        sql.Append(" ,ei.DATE_ITEM_ADDED DateItemAdded");
        sql.Append(" ,ei.USER_COMMENT UserComment");
        sql.Append(" ,ei.PLANNER_ID PlannerID");
        sql.Append(" ,ei.REASON_ID ReasonID, r.REASON_DESC ReasonDesc");
        sql.Append(" ,ei.STATUS_ID StatusID, s.STATUS_DESC StatusDesc");
        sql.Append(" FROM EMERGING_ISSUE ei");
        sql.Append(" LEFT OUTER JOIN EMERGING_ISSUE_STATUS s ON s.STATUS_ID = ei.STATUS_ID");
        sql.Append(" LEFT OUTER JOIN MERGING_ISSUE_REASON r ON r.REASON_ID = ei.REASON_ID");

        List<EmergingIssue> emergingIssues = conn.Query<EmergingIssue, Reason, Status, EmergingIssue>(sql.ToString(),
            (ei, r, s) =>
            {
                ei.Reason = r;
                ei.Status = s;
                return ei;
            },
            splitOn: "ReasonID, StatusID").ToList();

        return emergingIssues;
    }
}