LINQ - 为匿名类型的只读属性赋值

时间:2014-01-29 11:44:22

标签: c# asp.net linq anonymous-types

我想从linq创建一个匿名类型。然后手动更改单个属性(status)的值,​​并将列表作为数据源提供给转发器。但是不要让我这样做因为它是只读的。有什么建议吗?

 var list = from c in db.Mesai
                   join s in db.MesaiTip on c.mesaiTipID equals s.ID
                   where c.iseAlimID == iseAlimID
                   select new
                   {
                       tarih = c.mesaiTarih,
                       mesaiTip = s.ad,
                       mesaiBaslangic = c.mesaiBaslangic,
                       mesaiBitis = c.mesaiBitis,
                       sure = c.sure,
                       condition = c.onaylandiMi,
                       status = c.status
                   };
 foreach (var item in list)
 {
     if (item.condition==null)
     {
          item.status == "Not Confirmed";
     }
 }
 rpCalisanMesai.DataSource = list.ToList();
 rpCalisanMesai.DataBind();

3 个答案:

答案 0 :(得分:7)

创建列表时,只需在创建列表时设置正确的值,而不是尝试更改值。

var list = from c in db.Mesai
               join s in db.MesaiTip on c.mesaiTipID equals s.ID
               where c.iseAlimID == iseAlimID
               select new
               {
                   tarih = c.mesaiTarih,
                   mesaiTip = s.ad,
                   mesaiBaslangic = c.mesaiBaslangic,
                   mesaiBitis = c.mesaiBitis,
                   sure = c.sure,
                   condition = c.onaylandiMi,
                   status = c.onaylandiMi != null ? c.status : "Not Confirmed"
               };

此外,如果您可以更改属性,则问题是执行查询两次:首先在foreach - 循环中,然后再次调用list.ToList()(这将创建匿名类型的新实例)。

答案 1 :(得分:4)

你不能,匿名类型的属性是只读的。

您需要在对象创建期间进行设置。有关代码示例,请参阅@Dominic答案。

答案 2 :(得分:0)

你可以。例如:

var data = (from a in db.Mesai select new { ... status = new List<string>() .. }).ToList();

接下来,计算您的状态:

foreach (var item in data) {
    item.status.Add("My computed status");
} 

然后渲染:

foreach (var item data) {
    Response.Write(item.status[0]);
}

编辑:该列表甚至可以根据您的要求初始化:

var data = (from a in db.Mesai select new { ... status = new List<string>(new 
string[] { c.status }) .. }).ToList();
foreach (var item in data) {
    item.status[0] = "My computed status";
} 

EDIT2:似乎你必须初始化列表,最好用例如c.rowid.ToString(),否则优化器会为所有项目分配相同的新List(),认为这可能是某种游戏或其他东西。