2012-10-18 73 views
0

我正试图找到一种更有效的方法,以便将其他信息添加到查询中的列表中。例如,如果我与对象ID和StringA组对象的名单,我想查询基于对象ID数据库检索StringB和StringC:从linq-to-entities查询向列表中添加附加信息

public class SomeObject { 
    public int ObjectID { get; set; } 
    public string StringA { get; set; } 
    public string StringB { get; set; } 
    public string StringC { get; set; } 
} 

public void AddInformationToSomeObjects(List<SomeObject> someObjects) 
{ 
    var listOfIDs = someObjects.Select(so => so.ObjectID).ToList(); 
    var informationToAdd = db.Table.Where(t => listOfIDs.Contains(t.ObjectID)).Select(t => new { ObjectID = t.ObjectID, StringB = t.StringB, StringC = t.StringC }).ToList(); 

    foreach (var someObject in someObjects) 
    { 
     var information = informationToAdd.Where(i => i.ObjectID == someObject.ObjectID).FirstOrDefault(); 
     someObject.StringB = information.StringB; 
     someObject.StringC = information.StringC; 
    } 
} 

有什么办法来查询合并和分配到一个声明?

+0

Linq是一种查询语言 - 它不打算更新实体。看起来你可能会在foreach循环中遇到n + 1问题。如果这就是你想要解决的问题,那么在迭代它们之前,先在someObjects上做一个.ToList() – Dan

回答

1

刚刚更新了整个List ...

public void AddInformationToSomeObjects(IEnumerable<SomeObject> someObjects) 
{ 
    someObjects = 
     from obj in someObjects 
     join dbObj in db.Table 
     on obj.ObjectID equals dbObj.ObjectID 
     select new SomeObject 
     { 
      ObjectID = obj.ObjectID, 
      StringA = obj.StringA, 
      StringB = dbObj.StringB, 
      StringC = dbObj.StringC 
     } 
} 
0

正如扬P.说,这可能不是一个大问题,只是重新获取一个新的列表。但是,获得第一份名单涉及一些昂贵的操作(如获取斑点),您的想法一点也不差。作为简单的加入会做:

public List<SomeObject> AddInformationToSomeObjects(List<SomeObject> someObjects) 
{ 
    var listOfIDs = someObjects.Select(so => so.ObjectID).ToList(); 
    var informationToAdd = db.Table 
     .Where(t => listOfIDs.Contains(t.ObjectID)) 
     .Select(t => new { 
          ObjectID = t.ObjectID, 
          StringB = t.StringB, 
          StringC = t.StringC 
         }).ToList(); 

    return(
     from org in someObjects 
     join a in informationToAdd on org.ObjectID equals a.ObjectID 
     select new SomeObject { 
           ObjectID = org.ObjectID, 
           StringA = org.StringA, 
           StringB = a.StringB, 
           StringC = a.StringC 
          }).ToList(); 
} 

返回一个新的列表,而不是改变原来的仅仅是一个个人喜好(最小化的方法/函数的副作用)。