如何使用带有匿名类型的select new关键字将linq更新为sql值,因为我使用var
关键字并选择我需要的新查询,但它会返回如下错误
编译器错误消息:CS0200:属性或索引器' AnonymousType#1.Code'无法分配 - 它是只读的
这是我的代码:
var ProjectView12 = (from x in db.Projects
select new
{
add = db.Locations.Where(y = > y.ID == x.RegionID).FirstOrDefault().Name,
Province = db.Locations.Where(y = > y.ID == x.ProvinceID).FirstOrDefault().Name,
District = db.Locations.Where(y = > y.ID == x.DistrictID).FirstOrDefault().Name,
Code = x.Code,
Name = x.Name,
ProjectIdentificationDate = db.Milestones.Where(y = > y.ProjectID == x.ID && y.StageID == 1 && y.ComponentID == 1 && y.ModuleID == 1).FirstOrDefault().Date.ToString(),
ProjectLat = Convert.ToDecimal(x.Lat),
ProjectLong = Convert.ToDecimal(x.Lon),
Remarks = db.Milestones.Where(y = > y.ProjectID == x.ID && y.StageID == 1 && y.ComponentID == 1 && y.ModuleID == 1).FirstOrDefault().Remarks.ToString(),
}).ToList();
foreach(var item in ProjectView12)
{
item.Code = txtSubProjectCode.Text;
item.Name = txtSubProjectName.Text;
item.ProjectLat = Convert.ToDecimal(txtLatitude.Text);
item.ProjectLong = Convert.ToDecimal(txtLongitude.Text);
item.ProjectIdentificationDate = txtDate.Text;
item.Remarks = txtRemarks.Text;
} // txtLocation.Text = item.Region + ">" + item.Province + ">" + item.District;
try
{
db.SubmitChanges();
}
catch (Exception ex)
{
throw ex;
}
答案 0 :(得分:5)
好吧,你得到了编译器错误,因为 - 正如它所说的那样 - 匿名类型的属性在C#中是只读的。
更基本的是,即使你可以修改它们,你也不得不期望LINQ to SQL能够反转你投入到投影中的任何内容,以便更新原始表。对我来说这似乎是一个相当高的命令 - 特别是对于这个特殊情况下的Remarks
属性。
基本上,为了更新数据库,您需要更改从表中映射的实体。让您的查询选择相关的实体,然后您可以在必要时从客户端代码中进行投影 - 只要您仍然有对要修改的实体的引用。