我想从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();
答案 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(),认为这可能是某种游戏或其他东西。