LINQ查询问题,需要加入

时间:2009-07-08 15:28:26

标签: c# linq

不完全确定这个标题的好标题,随意将其编辑为好的标题

我有一个图像对象,其中包含与其相关的器官列表。

我想查询一个图像列表,找出哪些图像在器官列表中所有器官。

这是方法签名

public static IEnumerable<Image> WithOrgans(this IEnumerable<Image> qry, IEnumerable<Organ> organs)

不太确定如何为此构建linq,会欣赏一些想法,我有一段时间没有做过linq,所以我很生气!

更新

好的,这是一些示例数据

    dictionary.Add(7, new Image { id = 7, organs = new List<Organ> { organA, organB }});
    dictionary.Add(8, new Image { id = 8, organs = new List<Organ> { organA }});
    dictionary.Add(9, new Image { id = 9, organs = new List<Organ> { organC }});

5 个答案:

答案 0 :(得分:10)

使用Intersect执行此操作的另一种方法:

from i in qry 
where i.Organs.Intersect(organs).Count == organs.Count
select i

ETA:

从你的评论中,你提到你正在获得一个WhereListIterator。我相信WhereListIterator实现了IEnumerable,所以你会得到你应该得到的确切内容。

如果您发现结果不应该是空的,您可能需要检查以确保您的Image类正确实现了Equals()和GetHashCode(),以便可以有效地比较它们。

答案 1 :(得分:1)

假设图像的关联器官存储在Image.Organs集合中,以下查询将完成这一操作。如果由于功能不受支持而需要进行一些修改,则取决于您的LINQ提供程序。

public static IEnumerable<Image> WithOrgans(
    this IEnumerable<Image> qry, IEnumerable<Organ> organs)
{
    return qry.Where(image => organs.All(organ => image.Organs.Contains(organ)));
}

答案 2 :(得分:0)

也许是这样的?

var imagesWithAllOrgans = 
    from image in qry
    where image.Organs.All(organ => organs.Contains(organ))
    select image;

这假设器官是您希望比较图像的所有不同器官的枚举。

答案 3 :(得分:0)

这是一个想法:

为具有每个器官的图像创建一个查询,然后与那些

相交

(粗略代码)

    var imagesPerOrgan = organs.Select(organ => ImagesOrgans.Where(io => io.OrganId = organ.Id));
    var result = null;
    foreach (var item in imagesPerOrgan)
    {
        if (result == null)
        {
            result = item;
        }
        else
        {
            result = result.Intersect(result);
        }

    }

答案 4 :(得分:0)

只是为了好玩:

IEnumerable<Image> result = qry
  .SelectMany(i => i.Organs, (i, o) => new {i, o})
  .GroupBy(x => x.o, x => x.i}
  .Where(kvp => organs.Contains(kvp.Key))
  .Select(kvp => kvp.Value)
  .Aggregate( (z, x) => z.Intersect(x) );

带着ha句评论:

//unpack image hi-archy
//group images by organ
//filter to the list
//use the groups' values
//intersect all of those