我正在尝试使用 lambda 在 Linq 中编写一些代码。这是我使用 lambda 的第一个代码,我在更新 Record 时遇到了问题。 我的代码是:
using (DataClasses1DataContext db = new DataClasses1DataContext())
{
Table<NOTIF_RECIP> NOTIF_RECIP_alias = db.GetTable<NOTIF_RECIP>();
Table<NOTIF_SCHED> NOTIF_SCHED_alias = db.GetTable<NOTIF_SCHED>();
Table<mainframe_replication> mainframe_replication_alias = db.GetTable<mainframe_replication>();
var ids = NOTIF_SCHED_alias.Select(x => x.NOTIF_RPT_ID).ToArray();
foreach (string notif_sched_data in ids)
{
var repljoinmf = mainframe_replication_alias
.Join(NOTIF_RECIP_alias,
mfr => mfr.RPT_ID,
nr => nr.NOTIF_RECIP_ID,
(mfr, nr) => new
{
ReportId=mfr.RPT_ID,
Reportversion=mfr.RPT_VERS,
ReportBytes= mfr.RPT_BYTES.ToString(),
ReportDate=mfr.REPL_DTM.ToString(),
NotifId= mfr.NOTIF_ID,
RecipAdd=nr.NOTIF_RECIP_ADDR
});
foreach(var repljoinmf_data in repljoinmf)
{
//DO STUFF
repljoinmf_data.NotifId = "Changedxyz";
//db.SubmitChanges();
}
}
}
我在 repljoinmf_data.NotifId = "Changedxyz";
中遇到错误
错误提示:错误 2 属性或索引器“AnonymousType#3.NotifId”无法分配给 -- 它是只读的
有人可以帮我解决这个问题吗?我认为这是因为我使用的是匿名的 var,但如何解决这个问题。感谢任何帮助。
谢谢
最佳答案
如错误所示,匿名类实例一旦被投影就无法修改。
虽然您可以切换到强类型类,然后重新分配成员属性,但是,您有机会将前面 LINQ 语句中的所需结果转换到同一个匿名类中:
var repljoinmf = mainframe_replication_alias
.Join(NOTIF_RECIP_alias, mfr => mfr.RPT_ID, nr => nr.NOTIF_RECIP_ID,
(mfr, nr) => new // Anon Class projection
{
ReportId=mfr.RPT_ID,
Reportversion=mfr.RPT_VERS,
ReportBytes= mfr.RPT_BYTES.ToString(),
ReportDate=mfr.REPL_DTM.ToString(),
NotifId= "Changedxyz", // *** No need to mutate this afterwards
RecipAdd=nr.NOTIF_RECIP_ADDR
});
编辑、更新不是微不足道的任务,建议的替代方案
选项 #1:强类型类在投影后具有突变
添加一个新类(我猜到了一些类型)
public class MyPoco
{
public int ReportId {get; set;}
public string Reportversion {get; set;}
public byte[] ReportBytes {get; set;}
public DateTime ReportDate {get; set;}
public int NotifId {get; set;}
public string RecipAdd {get; set;}
}
然后您可以将其投影到其中(只需指定类名而不是匿名):
(mfr, nr) => new MyPoco // Not anonymous
{
ReportId=mfr.RPT_ID,
...
然后再做修改:
foreach(var repljoinmf_data in repljoinmf)
{
repljoinmf_data.NotifId = "SomeNewValue"
选项 #2 - 创建一个执行复杂逻辑的方法(或 Func)
由于您似乎已经将所有数据具体化,因此您可以在属性投影中自由使用复杂的功能。任何可用的局部变量(闭包)都可以传递给此函数,连接 lambda 参数也是如此 (mfr, nr)
例如,编写一个函数来计算您的 NotifId = "Changedxyz"
替换:
private string DoIntensiveLogic(mainframe_replication mfr, NOTIF_RECIP nr)
{
// Do Stuff
}
然后您可以在原始匿名投影中使用它:
(mfr, nr) => new // Anon Class projection
{
ReportId=mfr.RPT_ID,
Reportversion=mfr.RPT_VERS,
ReportBytes= mfr.RPT_BYTES.ToString(),
ReportDate=mfr.REPL_DTM.ToString(),
NotifId= DoIntensiveLogic(mfr, nr), // Call the function each row
RecipAdd=nr.NOTIF_RECIP_ADDR
});
关于c# - lambda 的 Linq 更新问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30326073/