代码之家  ›  专栏  ›  技术社区  ›  Chris James

LINQ查询问题,需要联接

  •  1
  • Chris James  · 技术社区  · 15 年前

    不完全确定是否有合适的标题,请随意将其编辑为一个好标题。

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

    我想查询一个图像列表,找出哪些图像 全部的 一系列器官中的器官。

    这是方法签名

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

    不太确定怎么做这个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 回复  |  直到 15 年前
        1
  •  10
  •   Eric Petroelje    15 年前

    另一种方法是使用Intersect:

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

    埃塔:

    从您的评论中,您提到您正在返回WhereListIterator。我相信WhereListIterator实现了IEnumerable,所以您将得到您应该得到的。

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

        2
  •  1
  •   Daniel Brückner    15 年前

    假设图像的关联器官存储在集合图像中。器官,下面的查询将完成此操作。如果由于不支持的函数而需要进行某些修改,则取决于您的LINQ提供程序。

    public static IEnumerable<Image> WithOrgans(
        this IEnumerable<Image> qry, IEnumerable<Organ> organs)
    {
        return qry.Where(image => organs.All(organ => image.Organs.Contains(organ)));
    }
    
        3
  •  0
  •   waterlooalex    15 年前

    以下是一个想法:

    为每个器官单独拥有的图像创建一个查询,然后与这些器官相交

    (粗略代码)

        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
  •   Joseph    15 年前

    也许是这样?

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

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

        5
  •  0
  •   Amy B    15 年前

    只是为了好玩:

    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