Як зробити приєднання в linq to sql з синтаксисом методу?


193

Я бачив багато прикладів у прикладах LINQ до SQL, як зробити приєднання до синтаксису запитів, але мені цікаво, як це зробити з синтаксисом методу? Наприклад, як я можу зробити наступне

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

з a .Join()? Чи може хтось проілюструвати чи надати ще один простий приклад?

Відповіді:


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

Як бачимо, коли мова йде про приєднання, синтаксис запитів, як правило, набагато читабельніший, ніж синтаксис лямба.


129

Джастін правильно показав розширення у тому випадку, коли за з'єднанням слідує a 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Тут прозорий ідентифікатор - але тому , що він прозорий, ви не можете побачити його в початковому запиті :)


5

Щоб додати тут інші відповіді, якщо ви хочете створити новий об’єкт третього іншого типу з пунктом «де» (наприклад, той, який не є об’єктом Entity Framework), ви можете зробити це:

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;

}    

Зверніть особливу увагу на проміжний об’єкт, який створений у пунктах Де та Вибрати.

Зауважте, що тут ми також шукаємо будь-які об'єднані об'єкти, які мають властивість1, яка відповідає одній із вхідних списку.

Я знаю, що це трохи складніше, ніж те, що шукав оригінальний запитувач, але, сподіваюся, це комусь допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.