Yöntem sözdizimi ile linq to sql birleştirme nasıl yapılır?


193

Ben sorgu sözdizimine katılmak nasıl SQL örnekleri LINQ çok örnekleri gördüm ama nasıl yöntem sözdizimi ile yapmak merak ediyorum? Örneğin aşağıdakileri nasıl yapabilirim?

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

ile .Join()? Herkes basit bir örneği açıklayabilir ya da gösterebilir mi?

Yanıtlar:


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

Şuna eşdeğer olur:

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

Gördüğünüz gibi, birleştirmeler söz konusu olduğunda, sorgu sözdizimi genellikle lambda sözdiziminden çok daha okunabilir.


129

Justin, birleşmenin hemen ardından a'nın geldiği durumda genişlemeyi doğru bir şekilde gösterdi select. Başka bir şeyiniz varsa, şeffaf tanımlayıcılar nedeniyle daha zorlaşır - C # derleyicisinin birleştirmenin her iki yarısının kapsamını yaymak için kullandığı mekanizma.

Justin'in örneğini biraz değiştirmek için:

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 }

şöyle bir şeye dönüştürülür:

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

zBurada şeffaf tanımlayıcı - ama şeffaf olduğu için, özgün sorguda göremiyorum :)


5

Buradaki diğer yanıtlara eklemek için, nerede yan tümcesi (ör. Entity Framework nesneniz olmayan bir nesne) ile üçüncü bir farklı türde yeni bir nesne oluşturmak isterseniz bunu yapabilirsiniz:

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 ve Select yan tümcelerinde oluşturulan ara nesneye özellikle dikkat edin.

Burada, giriş listesinde yer alan özelliklerden biriyle eşleşen property1 özelliğine sahip birleştirilmiş nesneleri de aradığımızı unutmayın.

Bunun orijinal askerin aradığından biraz daha karmaşık olduğunu biliyorum, ama umarım birine yardım eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.