【问题标题】:How to map an extra field from ExecuteQuery() in LINQ-TO-SQL but retain the LINQ entity如何从 LINQ-TO-SQL 中的 ExecuteQuery() 映射额外字段但保留 LINQ 实体
【发布时间】: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


    【解决方案1】:

    更好的主意:

    在这些情况下使用 Dapper :)

    另一个想法:

    添加一个伪属性。

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

    还有一个想法:

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

    【讨论】:

    • 是的,也许是针对一个新项目,但我对这个函数的所有调用都希望得到一个 LINQ-TO-SQL 实体列表。
    • @PeteShack:添加了 2 个 LINQ2SQL 选项。
    • 伪属性会很好用,我试过了,但是如果你不把 [Column] 属性放在它上面,它就不会被映射。我错过了什么吗?
    • @PeteShack:如果您在属性中设置了 Readonly = true 字段,那么它应该可以工作。然后禁用UpdateCheck
    • Column 属性似乎没有 ReadOnly 属性。尝试 [Column(DbType ="NVarChar(50)", CanBeNull=true, UpdateCheck=UpdateCheck.Never)],但 LINQ 查询给出“列名无效,还尝试添加存储属性 Storage="_TeamName"。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2011-03-25
      相关资源
      最近更新 更多