Справка, понимающая счетный. Метод соединения

Вчера я отправил этот вопрос относительно использования лямбд в Соединении () метод, чтобы проверить, существуют ли 2 условия через 2 объекта. Я получил ответ по вопросу, который работал отлично. Я думал после чтения статьи MSDN о Счетном. Соединение () метод, я понял бы точно, что происходило, но я не делаю. Кто-то мог помочь мне понять то, что продолжается в ниже кода (Соединение () метод конкретно)?Заранее спасибо.

if (db.TableA.Where( a => a.UserID == currentUser )
      .Join( db.TableB.Where( b => b.MyField == someValue ),
             o => o.someFieldID,
             i => i.someFieldID,
             (o,i) => o )
      .Any()) 
{
    //...
}

Править: А именно, мне любопытно на предмет последних 3 параметров, и что на самом деле продолжается. Как они приводят к требованиям подписи Func (TOuter, TKey), Func (TInner, TKey) и т.д.

11
задан Community 23 May 2017 в 12:09
поделиться

4 ответа

Эрик и Ник дали хорошие ответы.

Вы также можете написать выражение запроса Linq, используя синтаксис запроса (по сравнению с синтаксисом метода, который вы используете в своем примере):

var query = from a in db.TableA 
            join b in db.TableB on a.someFieldID equals b.someFieldID
            where a.UserID == currentUser && b.MyField == someValue
            select a;

        if (query.Any()) {
            ...
        }

Обновление:

Кажется, вы застряли на лямбда-выражениях. Это функция, которую вы передаете как переменную. Лямбда-выражение эквивалентно анонимному делегату (или анонимному методу, как мне кажется).

Вот ваш запрос с лямбда-выражениями в качестве делегатов (конечно, замените EntityType на тип вашей сущности, возвращенной из TableA):

if (db.TableA.Where( delegate(EntityType a) { return a.UserID == currentUser; } ) 
  .Join( db.TableB.Where( delegate(EntityType b) { return b.MyField == someValue; } ), 
         delegate(EntityType o) { return o.somefieldId); },
         delegate(EntityType i) { return i.someFieldId); },
         delegate(EntityType o, EntityType i) { return o; }) 
  .Any())  

{ // ... }

ПРИМЕЧАНИЕ. Лямбда-выражение имеет важные аспекты, которые делают его больше, чем просто эквивалентом анонимных методов. Я рекомендую вам просмотреть другие вопросы SO и, в частности, прочитать в Интернете о лямбда-выражениях. Они позволяют выразить очень сильные идеи гораздо проще и элегантнее. Это глубокая тема, но основы достаточно просты для понимания. Это функция, которую вы можете передавать как переменную или как параметр другим функциям.

3
ответ дан 3 December 2019 в 02:30
поделиться

Синтаксис соединения

FirstTable.Join(SecondTable, FirstTableKeyExtractor, SecondTableKeyExtractor, Selector)

Итак, у вас есть две таблицы. У вас есть ключ, общий для обеих таблиц. Вы предоставляете два экстрактора ключей, которые знают, как извлечь ключ из каждой строки таблицы.

Логика соединения определяет пары строк, по одной из каждой таблицы, с одним и тем же ключом.

Каждая из этих строк затем проходит через селектор для проецирования результата.

Это ответ на ваш вопрос?

22
ответ дан 3 December 2019 в 02:30
поделиться

Объяснение соединения.

b = тип объекта первой таблицы o = тип объекта первой таблицы i = тип объекта второй таблицы

  1. db.TableB.Where (b => b.MyField == someValue) Это тип элемента второй таблицы
  2. o => o.someFieldID Ключ первой таблицы
  3. i => i.someFieldID Ключ второй таблицы (который будет соответствовать ключу в первой таблице)
  4. (o, i) => o Возвращаемый объект, в данном случае тип объекта первой таблицы.
5
ответ дан 3 December 2019 в 02:30
поделиться

В этом запросе говорится присоединиться к TableA к TableB , где TableA.someFieldID == TableB.someFieldID и выбрать результаты из TableA и посмотреть, есть ли они результаты вообще

С точки зрения SQL подумайте об этом так, даже если это не Linq-to-SQL ... если вы знакомы с SQL, возможно, это имеет больше смысла:

Select Count(*)
From TableA a
     Join TableB b
       On a.someFieldID = b.someFieldID

Затем проверка, если Count (*) > 0

2
ответ дан 3 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: