Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#LINQ到实体-对象和对象集合相交处的属性_C#_Entity Framework_Linq To Entities - Fatal编程技术网

C#LINQ到实体-对象和对象集合相交处的属性

C#LINQ到实体-对象和对象集合相交处的属性,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,我曾经问过一个类似的问题,目的是了解如何获得另一组与我持有的模型具有相同属性的模型 现在的问题是: 那么,实际上引导我进入另一组的“相似属性”的名称是什么 原来的职位是: 我有3个模型,分别命名为: 具有Pencil.Id(int)和Pencil.Color(IEnumerable)属性的铅笔 具有Pen.Id(int)和Pen.Colors(IEnumerable)属性的笔 具有Id和名称的颜色 颜色模型是IEnumerable,因此它有多个颜色。例如这支钢笔有15种不同的颜色,铅笔有25种

我曾经问过一个类似的问题,目的是了解如何获得另一组与我持有的模型具有相同属性的模型

现在的问题是: 那么,实际上引导我进入另一组的“相似属性”的名称是什么

原来的职位是:

我有3个模型,分别命名为:

  • 具有Pencil.Id(int)和Pencil.Color(IEnumerable)属性的铅笔
  • 具有Pen.Id(int)和Pen.Colors(IEnumerable)属性的笔
  • 具有Id和名称的颜色
  • 颜色模型是IEnumerable,因此它有多个颜色。例如这支钢笔有15种不同的颜色,铅笔有25种不同的颜色。如果我拿着的笔的颜色中有一种在铅笔的调色板中也可用的话,我想带上那支腐蚀的铅笔

    拉斐尔的伟大解决方案是

    所以,这是可以的,就像一个魅力,但如何学习常见颜色的名称呢? 我们得到了其他具有相同颜色的属性,但那是什么颜色

    如果有人能提出这个LINQ查询,我将不胜感激。我是LINQ的新手,非常感谢您的帮助。

    您可以使用扩展来减少颜色

    var commonColors = 
        db.Pens.SelectMany(p => p.Colors)
            .Insersect(db.Pencils.SelectMany(hb => hb.Colors));
    

    因为
    Intersct
    可能返回一个序列,而不是一个集合,(我没有检查),所以可以像这样删除重复项

    var commonColors = 
        db.Pens.SelectMany(p => p.Colors).Distinct()
            .Insersect(db.Pencils.SelcectMany(hb => hb.Colors).Distinct());
    

    只需一支
    Pen
    do

    Pen p = db.Pens.Find(id); 
    var commonColors = Pen.Colors
        .Insersect(db.Pencils.SelcectMany(p => p.Colors));
    

    如果您手里拿着多支笔,请使用(在变量
    笔中)

    否则,如果您只有一支笔(在变量
    pen
    中)


    嗯,不确定在一个查询中获取所有内容是否有意义,但是,通过这个查询,您应该可以获得一个匿名铅笔对象列表和每支铅笔的常见颜色列表(未测试)


    很好,但我正在寻找钢笔(我拿着)的普通颜色和其他铅笔的交叉点。因此,钢笔只是一个物体,铅笔是一个收藏品。这种情况也适用吗?var commonColors=db.Pencils.SelectMany(p=>p.Colors.Distinct().insertest(Pen.Colors.Distinct());不起作用:(尊重拉斐尔。这真的很棒。你又一次做到了。我认为这是2的组合的最佳解决方案,但鲍勃的答案也起作用了,他是第一个回答的人。我希望你能理解。@Gorki先生,没问题,这是正确的方法,没什么好理解的;)它给出了两个问题和非常需要的组合的解决方案。但你是对的,第一个答案是你的,回答了问题的所有要求。再次感谢你。
    Pen p = db.Pens.Find(id); 
    var commonColors = Pen.Colors
        .Insersect(db.Pencils.SelcectMany(p => p.Colors));
    
    var colors = pens.SelectMany(p=>p.Colors).Distinct(); 
    var commonColors = db.Pencils.SelectMany (p => p.Colors.Where(c=>colors.Contains(c))).Distinct()
    
    var colors = pen.Colors;
    var commonColors = db.Pencils.SelectMany (p => p.Colors.Where(c=>colors.Contains(c))).Distinct()
    
    int id = id_of_the_pen_that_i_am_holding;
    Pen p = db.Pens.Find(id);
    var penColorIds = p.Color.Select(m => m.Id).ToList();
    
    var list = db.Pencils.Where(pencil => pencil.Color.Any(color => penColorIds.Contains(color.Id))
    .Select(l => new {
       pencil = l,
       colors = l.Color.Where(c => penColorIds.Contains(c.Id))
    });