2009-07-08 55 views
1

不能完全确定一个好的标题如此,随意编辑它以一个好的LINQ查询问题,需要加入

我有一个图片对象,其中包含器官的名单,它是有关至。

我想查询一张图片列表,并找到哪些有所有的器官列表中的器官。

这里是方法签名

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

不能确定如何构建LINQ为此,希望得到一些想法,我还没有在一段时间做LINQ所以感到很生疏!

UPDATE

好了,所以这是一些示例数据

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 }}); 

回答

10

使用这样做的另一种方式相交:

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

ETA:

从你的评论,你提到你得到一个WhereListIterator回来。我相信WhereListIterator实现IEnumerable,所以你正在回到你应该得到什么。

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

0

也许这样吗?

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

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

+0

这将只是验证他们有相同数量的项目,不一定是相同的项目。 – 2009-07-08 15:32:56

+0

@Eric是的你是对的,我试图想出比这更好的东西。 – Joseph 2009-07-08 15:34:17

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))); 
} 
+0

提前30秒:) – JoshJordan 2009-07-08 15:34:07

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); 
     } 

    } 
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)); 

随着俳句评论:

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