Как сделать объединения в linq to sql? - PullRequest
2 голосов
/ 25 августа 2009

Привет, как вы присоединяетесь в linq к sql?

Я вижу, что у них есть ключевое слово join и group join, но что это за соединения?

Левый, Правый, Крест, Внутренний?

Кроме того, как мне выбрать определенные столбцы, как только я закончу?

Как

Выбрать столбец1, столбец2
Из таблицы А;

Либо синтаксис запроса, либо метод в порядке. Я до сих пор не могу решить, что мне нравится больше, у каждого, кажется, есть свои плюсы.

Ответы [ 3 ]

4 голосов
/ 25 августа 2009

В качестве первого шага, я бы определенно рекомендовал прочитать превосходное Скотта Гатри, использующее учебник Linq-to-SQL , состоящий из нескольких частей. Он охватывает многие из этих основ Linq-to-SQL.

Также посмотрите Hooked на LINQ 5-минутный обзор - как там упоминалось, часто в Linq-to-SQL, вам даже не нужно самому выражать JOINs - LINQ-to-SQL обрабатывает многие из них напрямую, предоставляя ссылки на сущности и ссылки на наборы сущностей.

Если вы затем решите, что вы действительно ДОЛЖНЫ использовать явное СОЕДИНЕНИЕ, Билал Хайдар прекрасно покажет, как сделать явное ВЛЕВОЕ СОЕДИНЕНИЕ * В своем сообщении в блоге.

«Нормальный» случай ВНУТРЕННЕГО СОЕДИНЕНИЯ относительно прост - вы просто добавляете

from c in customers
  join o in orders on o.customerid equals c.customerid

к вашему запросу.

Что касается выбора отдельных полей - см. Вступительную статью Скотта Гатри - он объясняет это очень подробно!

По сути, вы можете сделать одну из трех вещей:

  • выберите целую сущность (например, клиента) и получите всю информацию для нее
  • выбрать некоторые поля в новый существующий тип (например, тип "CustomerOrder")
  • выделить несколько полей в новый анонимный тип

Это выберет всех клиентов, у которых есть заказ:

   from c in customers
      join o in orders on o.customerid equals c.customerid
      select c;

Это позволит выбрать всех клиентов и заказы в новый тип "CustomerOrder", который уже существует в вашем проекте:

   from c in customers
      join o in orders on o.customerid equals c.customerid
      select new CustomerOrder { CustomerName = c.Name, 
                                 CustomerID = c.CustomerId,
                                 OrderDate = o.OrderDate, ...... } ;

Это позволит выбрать идентификатор клиента и дату заказа в новый анонимный тип для использования:

   from c in customers
      join o in orders on o.customerid equals c.customerid
      select new { CustomerID = c.CustomerId, OrderDate = o.OrderDate } ;

Это сильный тип - и за этим стоит полноценный тип .NET CLR - вы просто не знаете его имени :-) Но вы можете использовать эти элементы в коде, вы получите Intellisense и все - отлично для быстрого временного манипулирования некоторыми данными.

Марк

0 голосов
/ 25 августа 2009

Ключевое слово join в LINQ даст вам внутреннее соединение. Вы можете «спроецировать» свои результаты, создав новый объект в предложении select. Этот объект может быть напечатан или анонимно. Вот пример:

var ordersAndProducts = from o in orders
    join p in products on o.ProductId equals p.ProductId
    select new { OrderDate = o.OrderDate, ProductName = p.Name };

Этот запрос выполняет внутреннее объединение коллекций заказов и продуктов в свойстве ProductId. Каждый элемент в результирующей коллекции проецируется на анонимный объект (новый {... список свойств / значений ...} создает объект на лету.

Если вы используете LINQ to SQL (и похоже, что вы это делаете), вы можете увидеть оператор SELECT, который отправляется в вашу базу данных, либо отладив ваше приложение, либо запустив профилировщик в вашей базе данных.

0 голосов
/ 25 августа 2009

Ознакомьтесь со статьей MSDN о соединениях LINQ-To-SQL: http://msdn.microsoft.com/en-us/library/bb425822.aspx#linqtosql_topic12

Объединение в LINQ является внутренним объединением.

Групповое объединение в LINQ - это объединение с предложением into. Родительская информация объединяется с группами дочерней информации. То есть дочерняя информация объединяется в коллекцию, а родительская информация дочерней коллекции встречается только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...