使用select new关键字将linq更新为sql值

时间:2015-03-18 06:49:11

标签: c# linq-to-sql

如何使用带有匿名类型的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;
}

1 个答案:

答案 0 :(得分:5)

好吧,你得到了编译器错误,因为 - 正如它所说的那样 - 匿名类型的属性在C#中是只读的。

更基本的是,即使你可以修改它们,你也不得不期望LINQ to SQL能够反转你投入到投影中的任何内容,以便更新原始表。对我来说这似乎是一个相当高的命令 - 特别是对于这个特殊情况下的Remarks属性。

基本上,为了更新数据库,您需要更改从表中映射的实体。让您的查询选择相关的实体,然后您可以在必要时从客户端代码中进行投影 - 只要您仍然有对要修改的实体的引用。