Dapper 嵌套对象查询 - 不填充所有属性
Dapper nested object query - not populating all properties
我正在尝试 return 将平面结果集 Dapper.NET 放入嵌套对象中(EmergingIssue 包含 Reason 和 Status 对象),但查询并未填充所有列。请参阅下面的 POCO:
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 class 的代码(从类似的 Whosebug 问题中采用):
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;
}
}
此结果是 returning 多个字段,但未填充 UserComment、PlannerID、DateItemAdded 和其他几个字段。很明显,问题出在投影数据的 Linq 函数上,但我对语法不够熟悉,无法理解如何解决它。
此外,是否有用于学习更高级功能的宝贵 Linq 资源?例如,我经常使用 .Where(x => x.StringValue == "Test")
(以及其他类似的、简单的)功能,但我并不经常像上面尝试的那样传递函数。
问题出在这里:
splitOn: "ReasonID, StatusID"
您不能在 splitOn
字符串中添加任何白色 space,因为 Dapper 只是用逗号分隔该字符串 - 它会查找名为 " StatusId"
的列(带有 space开头)
与其使用 StringBuilder
创建查询,不如尝试使用 SqlBuilder
class。在我看来,它将为您提供更具可读性的查询创建。
我也发现这个人,创造了它的一个伟大的扩展。 https://github.com/ronnieoverby/UniqueNamespace.SqlBuilder
我正在尝试 return 将平面结果集 Dapper.NET 放入嵌套对象中(EmergingIssue 包含 Reason 和 Status 对象),但查询并未填充所有列。请参阅下面的 POCO:
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 class 的代码(从类似的 Whosebug 问题中采用):
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;
}
}
此结果是 returning 多个字段,但未填充 UserComment、PlannerID、DateItemAdded 和其他几个字段。很明显,问题出在投影数据的 Linq 函数上,但我对语法不够熟悉,无法理解如何解决它。
此外,是否有用于学习更高级功能的宝贵 Linq 资源?例如,我经常使用 .Where(x => x.StringValue == "Test")
(以及其他类似的、简单的)功能,但我并不经常像上面尝试的那样传递函数。
问题出在这里:
splitOn: "ReasonID, StatusID"
您不能在 splitOn
字符串中添加任何白色 space,因为 Dapper 只是用逗号分隔该字符串 - 它会查找名为 " StatusId"
的列(带有 space开头)
与其使用 StringBuilder
创建查询,不如尝试使用 SqlBuilder
class。在我看来,它将为您提供更具可读性的查询创建。
我也发现这个人,创造了它的一个伟大的扩展。 https://github.com/ronnieoverby/UniqueNamespace.SqlBuilder