【发布时间】:2011-10-25 04:48:22
【问题描述】:
假设我有一个职位表和一个相关的团队表 我需要从 ExecuteQuery() 调用中获取职位实体列表以及相关表中的团队名称。如:
var list = dc.ExecuteQuery<T>("SELECT Position.*, Team.Name AS TeamName " +
"FROM Position LEFT JOIN Team ON Position.TeamID=Team.TeamID");
(我需要使用ExecuteQuery(),因为实际查询很复杂。)
是的,我可以创建一个新的平面类,其中包含来自 Position 类的所有字段以及 teamname 字段,但我需要结果集是实际的 LINQ 实体,而不仅仅是 POCO,因为我将遍历这些记录并更新一些字段。
第一个想法,创建一个包含Position和新字段的新类
public class PositionExtended
{
public Position position {get; set;}
public string teamname {get; set;}
}
ExecuteQuery<PositionExtended>("SELECT Position.*, Team.Name AS TeamName " +
"FROM Position LEFT JOIN Team ON Position.TeamID=Team.TeamID");
这会正确映射团队名称,但不能正确映射位置对象。
第二个想法,继承自 Position 类:
public class PositionExtended : Position
{
public string teamname {get; set;}
}
ExecuteQuery<PositionExtended>("SELECT Position.*, Team.Name AS TeamName " +
"FROM Position LEFT JOIN Team ON Position.TeamID=Team.TeamID");
这将返回错误“该字段(Position 类的第一个字段)不是 PositionExtended 类型映射的一部分。该成员是否位于继承层次结构的根之上?”
最后的想法,使用部分类:
public partial class Position
{
[Column(Name="TeamName")]
public string TeamName {get; set;}
}
ExecuteQuery<Position>("SELECT Position.*, Team.Name AS TeamName " +
"FROM Position LEFT JOIN Team ON Position.TeamID=Team.TeamID");
这实际上适用于这个特定的 SQL 查询,但是它改变了 Position 类,并且所有其他返回 Positions 的 LINQ 调用都失败了,因为 teamname 字段实际上并不是 Position 表的一部分,因此不会在查询中返回。
对于这些想法中的任何一个或更好的想法,有人有解决方法吗?
【问题讨论】:
标签: c# linq-to-sql executequery