C # LINQ соединение из против подзапроса - PullRequest
0 голосов
/ 20 июня 2019

в LINQ (синтаксис запроса) У меня может быть несколько froms.

Насколько я могу прочитать:

"выражение запроса может содержать подзапросы, которые также начинаются с предложения from ..."

Источник: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/from-clause

Но в чем разница между соединением из (которое использует множественные выражения) и подзапросом?Пример для соединения from выглядит примерно так:

List<A> persons = new List<A>();

var query = from mychild in persons
            from ch in mychild.Children 
            from c in ch.Children 
            select c;

Или это вторая строка "из ch in ..", подзапрос для первой строки (из mychild) и в третьей строке "из cПодзапрос для из ч?А соединение от - это имя для всех подзапросов?

Ответы [ 3 ]

1 голос
/ 20 июня 2019

Каждый запрос синтаксиса запроса должен заканчиваться выражением select. Вот как вы можете дифференцировать подзапрос. Если вы должны были интерпретировать:

from c in ch.Children 
select c;

В качестве подзапроса запрос будет:

var query = from mychild in persons
            from ch in mychild.Children 
            (from c in ch.Children 
            select c);

И внешний запрос:

from mychild in persons
from ch in mychild.Children 

не будет иметь выражения select.

Кроме того, если бы это был подзапрос, он просто поместил бы запрос в конец оператора from и не описывал, как он используется. Чтобы включить его во внешний запрос, его нужно как-то использовать . Чтобы запрос Children был подзапросом, вы могли бы сделать что-то вроде этого:

var query = from mychild in persons
            from ch in mychild.Children 
            from outerChild in 
                (from innerChild in ch.Children 
                select innerChild)
            select outerChild;

Очевидно, что это бесполезный способ иметь подзапрос, но это тот тип преобразования, который требуется для его интерпретации как подзапроса.

Так что да, просто посчитайте количество select ключевых слов, чтобы увидеть количество запросов.

0 голосов
/ 20 июня 2019

Эта конструкция переводится как .SelectMany. Его можно использовать для перехода вниз по отношению 1-многие.

var query =
  from customer in customers
  from order in customer.Orders
  select order;

Эта конструкция генерирует подзапрос.

DateTime today = DateTime.Today;
var query =
  from customer in customers
  let orderCount = (
    from order in customer.Orders
    where order.ShipDate == today
    select order).Count()
  select new {customer, orderCount};
0 голосов
/ 20 июня 2019

Составное предложение from - это когда вы получаете доступ к внутреннему элементу из внешнего запроса. В противном случае вы можете определить подзапрос, который работает с другим источником данных.

Рассмотрим следующий пример:

var somePersons = new List<Person>
{
    new Person { Names = new List<string> { "John", "Smith" } },
    new Person { Names = new List<string> { "Mike", "Soandso" } }
};

var otherPersons = new List<Person>
{
    new Person { Names = new List<string> { "Jane", "Doe" } },
    new Person { Names = new List<string> { "Sarah", "Connor" } }
};

var query = from person1 in somePersons
            from name1 in person1.Names
            from person2 in otherPersons
            from name2 in person2.Names
            select new Person { Names = new List<string> { name1, name2 } };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...