【问题标题】:How to do a join in linq to sql with method syntax?如何使用方法语法在 linq to sql 中进行连接?
【发布时间】:2011-03-14 03:48:40
【问题描述】:

我在 LINQ to SQL 示例中看到了很多关于如何在查询语法中进行连接的示例,但我想知道如何使用方法语法来做到这一点?例如我该怎么做以下

var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             select new { SomeClass = sc, SomeOtherClass = soc }

.Join()?谁能说明或提供另一个简单的例子?

【问题讨论】:

    标签: linq-to-sql ef-fluent-api


    【解决方案1】:
    var result = from sc in enumerableOfSomeClass
                 join soc in enumerableOfSomeOtherClass
                 on sc.Property1 equals soc.Property2
                 select new { SomeClass = sc, SomeOtherClass = soc };
    

    相当于:

    var result = enumerableOfSomeClass
        .Join(enumerableOfSomeOtherClass,
              sc => sc.Property1,
              soc => soc.Property2,
              (sc, soc) => new
                           {
                               SomeClass = sc,
                               SomeOtherClass = soc
                           });
    

    如您所见,在连接方面,查询语法通常比 lambda 语法更具可读性。

    【讨论】:

      【解决方案2】:

      Justin 正确地显示了在连接后跟 select 的情况下的扩展。如果你有其他东西,由于透明标识符,它会变得更加棘手 - C# 编译器用来传播连接的两半范围的机制。

      所以稍微改变一下贾斯汀的例子:

      var result = from sc in enumerableOfSomeClass
                   join soc in enumerableOfSomeOtherClass
                   on sc.Property1 equals soc.Property2
                   where sc.X + sc.Y == 10
                   select new { SomeClass = sc, SomeOtherClass = soc }
      

      会被转换成这样的:

      var result = enumerableOfSomeClass
          .Join(enumerableOfSomeOtherClass,
                sc => sc.Property1,
                soc => soc.Property2,
                (sc, soc) => new { sc, soc })
          .Where(z => z.sc.X + z.sc.Y == 10)
          .Select(z => new { SomeClass = z.sc, SomeOtherClass = z.soc });
      

      这里的z 是透明标识符——但因为它是透明的,所以在原始查询中看不到它:)

      【讨论】:

        【解决方案3】:

        要在此处添加其他答案,如果您想使用 where 子句创建第三种不同类型的新对象(例如,不是您的实体框架对象),您可以这样做:

        public IEnumerable<ThirdNonEntityClass> demoMethod(IEnumerable<int> property1Values)
        {
            using(var entityFrameworkObjectContext = new EntityFrameworkObjectContext )
            {
                var result = entityFrameworkObjectContext.SomeClass
                    .Join(entityFrameworkObjectContext.SomeOtherClass,
                        sc => sc.property1,
                        soc => soc.property2,
                        (sc, soc) => new {sc, soc})
                    .Where(s => propertyValues.Any(pvals => pvals == es.sc.property1)
                    .Select(s => new ThirdNonEntityClass 
                    {
                        dataValue1 = s.sc.dataValueA,
                        dataValue2 = s.soc.dataValueB
                    })
                    .ToList();
            }
        
            return result;
        
        }    
        

        特别注意在 Where 和 Select 子句中创建的中间对象。

        请注意,这里我们还会查找任何具有与输入列表中的其中一个匹配的 property1 的连接对象。

        我知道这比最初的提问者所寻找的要复杂一些,但希望它会对某人有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-06-23
          • 2018-10-31
          • 2012-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多