有没有办法使用linq添加属性?

时间:2012-10-01 18:12:25

标签: linq linq-to-sql

所以我有这个列表,它返回一个ID和一个缩略图。恩。 List<PersonPicture> 我有这个列表List<Person>,其中有一个名为“picture”的属性。 无论如何我可以合并这两个属性并将List<PersonPicture>添加到名为“picture”的属性中,并通过ID将其作为基础,因为它们具有相同的属性吗?

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:2)

您可以在此示例下使用匿名对象:

List<PersonPicture> pictures = LoadPictures();
List<Person> persons = LoadPersons();

var result = persons.Select(pers => new
{
  Id = pers.Id,
  Name = pers.Name,
  Picture = pictures.Where(pic => pic.PersId == pers.Id)
    .FirstOrDefault()
    .Thumbnail
};

另一种解决方案是使用Join:

var result = persons.Join(pictures, 
  pers => pers.Id, 
  pic => pic.PersId,
  (pers, pic) => { 
    return new
    {
      Id = pers.Id,
      Name = pers.Name,
      Picture = pic.Thumbnail
    };
  });

答案 1 :(得分:2)

LINQ并不是设计用于修改像这样的现有集合,但你可以这样做:

foreach (tup in people
    .Join(
        picture,
        person => person.ID,
        picture => picture.ID,
        Tuple.Create
    ))
{
    tup.Item1.Picture = tup.Item2;
}

编辑:请注意,如果一个人有多张图片,这将产生不可预测的结果。这是一种可能性,应该如何处理?

答案 2 :(得分:0)

您可以在linq中使用JoinZip运算符。这些链接将引导您询问有关使用它们的语法。基本上,Join只是像SQL一样基于一个键将两个列表一起添加,Zip通过匹配每个列表中每个元素的位置来合并两个列表。

答案 3 :(得分:0)

您希望加入基于共享密钥的两个列表 - ID。

基本上,您希望使用LINQ中的Join运算符来查找匹配相同ID的PersonPersonPicture对:

    persons.Join(pictures, // join these two lists 
        person => person.Id, // extract key from person
        personPicture => personPicture.PersonId, // extract key from picture
        (person, personPicture) => ??? // do something with each matching pair

您现在面临的问题是如何处理每个匹配对; Join允许您提供一个带有匹配对的委托并返回其他内容,而Join操作的结果将是从每个匹配对产生的其他内容的列表。

您的问题是您希望拍摄每一对并对其执行某些操作 - 具体而言,您希望将图片从PersonPicture对象复制到Person对象。由于LINQ完全是为了查找数据而不是修改数据,因此这并非易事。

您可以通过两种方式完成此操作。一种是从每对创建一个临时对象,然后迭代它并做你的事情:

    var pairs = persons.Join(pictures, 
        person => person.Id, 
        personPicture => personPicture.PersonId,
        (person, personPicture) => new { person, personPicture };

    foreach (var pair in pairs) 
        pair.person.Picture = pair.personPicture.Thumbnail;

(您可以使用Tuple而不是临时对象,如另一个答案所示)。

这很有效,但由于临时对象(无论是匿名对象还是元组),它看起来很笨拙。

或者,您可以在委托内部进行赋值,并返回Person对象本身,因为您已经完成了PersonPicture对象:

    var personsWithPicturesPopulated = persons.Join(pictures, 
        person => person.Id, 
        personPicture => personPicture.PersonId,
        (person, personPicture) => { 
             person.Picture = personPicture.Thumbnail; 
             return person;
        });

这有一个额外的好处,就是在personPictures列表中找到您找到匹配的人员列表,省略没有匹配的人;这有时正是你所需要的(有时它不是,在这种情况下你可以放弃连接的结果)。