2012-05-21 4 views
1

Я озадачен нижеследующим.Способы написания LINQ C#

Я использую LINQ в моих проектах с использованием форматов, таких как:

var query =  
    from obj_i in set1 
    join obj_j in set2 on 
     new { 
      JoinField1 = obj_i.SomeField1, 
      JoinField2 = obj_i.SomeField2, 
      JoinField3 = obj_i.SomeField3, 
      JoinField4 = obj_i.SomeField4 
     } 
     equals 
     new { 
      JoinField1 = obj_j.SomeOtherField1, 
      JoinField2 = obj_j.SomeOtherField2, 
      JoinField3 = obj_j.SomeOtherField3, 
      JoinField4 = obj_j.SomeOtherField4 
     } 

Но я недавно сказал, что ниже также «другой путь» из написания LINQ запросов.

var query =  
    from obj_i in set1 
    join obj_j in set2 on  
    obj_i.SomeField1 = obj_j.SomeOtherField1 and 
    obj_i.SomeField2 = obj_j.SomeOtherField2 and 
    obj_i.SomeField3 = obj_j.SomeOtherField3 and 
    obj_i.SomeField4 = obj_j.SomeOtherField4 

Как я понимаю, с помощью одного = неправильно (особенно в том случае, когда на == не применяется, так как вам нужно использовать equals, но и с помощью and является неправильным, так как правильное ключевое слово будет && если вы разрешили использовать ничего, кроме equals в этом случае.

Я могу понять использование && и == в предложении где, что делает его еще более совершенны, что приведенный выше код может быть использован, так как он не даже компилировать.

Я что-то упустил? Если да, не могли бы вы указать мне, где я могу узнать об этом альтернативном методе написания LINQ?

+0

Может быть «они» называют синтаксисом VB.NET. Но ты прав. В C# это '==' и '&&'. Не '=' и 'и'. –

+0

@ SaniHuttunen действительно я думал о VB.NET, но даже это требует использования 'equals' – ericosg

+0

Второй недействительный запрос, даже с исправлениями для операторов. Синтаксис 'join' -' join в на равен '. –

ответ

4

Но недавно мне сказали, что нижеследующее также является «другим способом» написания запросов LINQ.

Нет, второй синтаксис, который вы показываете, неверен. Просто попробуйте, вы увидите, что он не компилируется.

Предложение join в синтаксисе понимания запроса Linq переведено на вызов метода расширения Join. Например, этот запрос:

var query = 
    from x in a 
    join y in b 
    on x.Foo equals y.Bar 
    select Baz(x, y); 

переведен на:

var query = a.Join(b, x => x.Foo, y => y.Foo, (x, y) => Baz(x, y)); 

Таким образом, вы можете увидеть, что части слева и справа от equals соответствуют различным параметрам метода Join: левая часть выбирает ключ соединения для первого источника, а правая часть выбирает ключ для второго источника. Эти клавиши затем сопоставляются друг с другом для выполнения соединения. Это важная часть: в предложении on не указывается условие объединения свободной формы, в нем указано, как извлечь ключ соединения с каждой стороны. Поэтому левые и правые переключатели клавиш имеют, которые должны быть четко разделены; второй синтаксис, который вы показываете, не может работать, потому что невозможно извлечь полную информацию о ключе для любого источника: объединение может быть выполнено только путем оценки условия соединения для каждого (x, y), что является операцией O(n²) вместо (примерно) O(n) операция.

Однако иногда вам требуется больше гибкости, чем то, что может дать equi-join; в этом случае вы можете использовать перекрестное соединение и фильтровать результаты:

var query = 
    from x in a 
    from y in b 
    where x.Foo == y.Bar 
    select Baz(x, y); 

Или в вашем случае:

var query =  
    from obj_i in set1 
    from obj_j in set2 
    where obj_i.SomeField1 == obj_j.SomeOtherField1 
    && obj_i.SomeField2 == obj_j.SomeOtherField2 
    && obj_i.SomeField3 == obj_j.SomeOtherField3 
    && obj_i.SomeField4 == obj_j.SomeOtherField4; 
+0

спасибо, я знаю, что он не компилируется, поэтому я почти собираюсь поверить, что они ссылались на библиотеку LINQ с Марса. Хороший ответ, заставляет меня задаться вопросом, почему VB.NET может использовать 'equals' и' and' в 'join'. – ericosg

+0

@ericosg, он недействителен в VB.NET либо ... –

+0

Я просто скомпилировал и запустил ниже в VB.NET и отлично работает. Dim запрос = От одного В setones Присоединяйтесь два в settwos На one.ID Равно two.ID И one.Name Равно two.ContactName – ericosg

Смежные вопросы