【问题标题】:Why does Linq need a setter for a 'read-only' object property?为什么 Linq 需要一个“只读”对象属性的设置器?
【发布时间】:2011-07-21 08:01:40
【问题描述】:

我正在使用 Linq DataContext.ExecuteQuery("some sql statement") 来填充对象列表

var incomes = db.ExecuteQuery<IncomeAggregate>(sqlIncomeStatement(TimeUnit));

IncomeAggregate 是我为保存此查询记录的结果而创建的对象。

这个对象的一个​​属性是YQM:

public int Year { get; set; }
public int Quarter { get; set; }
public int Month { get; set; }

public string YQM 
{ 
    get { return string.Format("Y{0}-Q{1}-M{2}", Year, Quarter, Month); } 
}
... more properties

一切编译正常,但是当它执行 Linq 时出现以下错误:

无法为成员“YQM”赋值。它没有定义 setter。

但很明显,我不想“设置”它。 Y、Q 和 M 由查询提供给数据库。查询不提供 YQM。 我是否需要以某种方式更改对象的定义? (我刚开始使用 Linq,我还在跟上进度,所以它可能非常简单)

【问题讨论】:

  • 我尝试的另一个选项是放入一个“虚拟”设置器:private set { ;}
  • @JacksonPope:我希望找到一种方法让 Linq 知道不必从数据库中加载此值。在我的其余代码中,我更喜欢使用 YQM 作为属性。
  • 我还注意到,当我使用部分类向 LinqToSql 生成的类添加属性时,IS 可能在该部分类中只有一个 getter。
  • 这个问题类似于this SO post。他们得出了相同的private set { ;} 解决方案。

标签: linq readonly setter executequery


【解决方案1】:

好吧,我最后只是将 setter 设为私有

public string YQM {
    get 
    { 
        return string.Format("Y{0}-Q{1}-M{2}", Year, Quarter, Month); 
    }

    private set { ;} 
}

似乎有效。

【讨论】:

    【解决方案2】:

    Linq 假设该对象的 properties 是要从数据库加载的值,显然它无法设置 YQM 属性,因为它没有设置器。尝试将 YQM 改为一种方法:

    public string YQM() 
    { 
        return string.Format("Y{0}-Q{1}-M{2}", Year, Quarter, Month);  
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 2018-07-21
      • 2014-09-22
      相关资源
      最近更新 更多