5

假设我有一个 Position 表和一个相关的 Team 表,我需要从 ExecuteQuery() 调用中获取 Position 实体列表以及相关表中的 Team 名称。如:

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 表的一部分,因此不会在查询中返回。

有没有人有任何这些想法的解决方法,或者更好的想法?

4

2 回答 2

1

更好的主意:

在这些情况下使用 Dapper :)

另一个想法:

添加一个伪属性。

IOW,将TeamName属性添加到Position类中。如果是null,则它没有被使用。也不要用 LINQ2SQL 属性装饰它。

还有一个想法:

如果您不关心改变对象,只需创建一个视图并将其放入设计器中。如果需要,添加一些额外的属性以解析为真实实体。

于 2011-10-25T05:01:38.983 回答
0

我还没有尝试过,但我面临着非常相似的挑战。我正在考虑使用 Linq.Table 对象的 Attach 方法手动设置从 POCO 列表中返回的数据创建的真实实体实例。

于 2013-12-18T17:44:29.817 回答