Каков синтаксис внутреннего соединения в LINQ to SQL?

Я пишу оператор LINQ to SQL, и мне нужен стандартный синтаксис для обычного внутреннего соединения с предложением ON в C#.

Как вы представляете в LINQ to SQL следующее:

select DealerContact.*
from Dealer 
inner join DealerContact on Dealer.DealerID = DealerContact.DealerID

Если у вас есть внешний ключ между таблицами, вы должны посмотреть ответ Кирка Бродхерста ниже.

Guilherme 21.11.2016 01:35

Вы должны использовать имена таблиц во множественном числе. Таблица, содержащая (записи о) многих дилеров, должна называться дилеры, а не дилером.

ANeves thinks SE is evil 21.08.2017 13:32

@ANeves Это далеко не стандартная практика - использовать имена таблиц во множественном числе, вполне приемлемы как единственное, так и множественное число - я просто переключился с множественного на единственное число, чтобы соответствовать именам объектов - здесь верхний ответ соглашается, что единственное число более согласовано (многие формы множественного числа странные или нет. существует - например, «1 овца, 8 овец»: stackoverflow.com/questions/338156/…

niico 11.06.2018 11:47

@niico, я думаю, это не место для обсуждения этого ... но Microsoft Entity Framework множественное число имен таблиц, Ruby on Rails ORM множественное число таблиц ... это достаточно близко к стандартной практике для вас? :) Контр-аргумент: NHibernate кажется, что таблицы не во множественном числе.

ANeves thinks SE is evil 11.06.2018 23:36

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

niico 11.06.2018 23:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
454
5
612 023
19
Перейти к ответу Данный вопрос помечен как решенный

Ответы 19

Ответ принят как подходящий

Это выглядит примерно так:

from t1 in db.Table1
join t2 in db.Table2 on t1.field equals t2.field
select new { t1.field2, t2.field3}

Было бы неплохо иметь разумные имена и поля для ваших таблиц для лучшего примера. :)

Обновлять

Я думаю, что для вашего запроса это может быть более подходящим:

var dealercontacts = from contact in DealerContact
                     join dealer in Dealer on contact.DealerId equals dealer.ID
                     select contact;

Поскольку вы ищете контакты, а не дилеров.

спасибо, с этого момента я буду использовать разумные имена как лучшую практику, которая имеет смысл в linq, вместо from c or from t1

Shaiju T 14.01.2016 10:26

@JonLimjap Привет, дружище! Не могли бы вы мне помочь с этим вопросом: stackoverflow.com/questions/63901748/…

Roxy'Pro 15.09.2020 15:33

Используйте оператор Linq присоединиться:

var q =  from d in Dealer
         join dc in DealerConact on d.DealerID equals dc.DealerID
         select dc;

что делать, если мне нужны столбцы как d, так и dc?

Kuntady Nithesh 13.09.2012 12:55

@KuntadyNithesh Затем верните созданный вами класс, например выберите новый MyCustomer {Id = dc.id, Id2 = d.id} Вот и все!

Elisabeth 20.03.2015 17:44

var results = from c in db.Companies
              join cn in db.Countries on c.CountryID equals cn.ID
              join ct in db.Cities on c.CityID equals ct.ID
              join sect in db.Sectors on c.SectorID equals sect.ID
              where (c.CountryID == cn.ID) && (c.CityID == ct.ID) && (c.SectorID == company.SectorID) && (company.SectorID == sect.ID)
              select new { country = cn.Name, city = ct.Name, c.ID, c.Name, c.Address1, c.Address2, c.Address3, c.CountryID, c.CityID, c.Region, c.PostCode, c.Telephone, c.Website, c.SectorID, Status = (ContactStatus)c.StatusID, sector = sect.Name };


return results.ToList();

Привет, Подскажите, пожалуйста, о чем эта часть? Status = (ContactStatus) c.StatusID Меня особенно интересует фрагмент: (ContactStatus) c.StatusID С уважением, Мариуш

Mariusz 13.03.2010 02:55

@aristo - глядя на код, я предполагаю, что ContactStatus на самом деле является перечислением, а c.StatusID на самом деле не идентификатор, а числовое значение перечисления. Если я прав, (ContactStatus)c.StatusID на самом деле просто преобразует целое число в перечисление.

Joel Mueller 15.07.2010 02:13

И поскольку я предпочитаю синтаксис цепочки выражений, вот как это сделать:

var dealerContracts = DealerContact.Join(Dealer, 
                                 contact => contact.DealerId,
                                 dealer => dealer.DealerId,
                                 (contact, dealer) => contact);

Если вам нужно отфильтровать или выбрать поля из объединенных таблиц обе, а не только поля одной из двух таблиц (таблица DealerContact в примере этого ответа), вот пример: stackoverflow.com/a/29310640/12484

Jon Schneider 28.03.2015 00:41

в основном оператор LINQ присоединиться не дает преимуществ для SQL. Т.е. следующий запрос

var r = from dealer in db.Dealers
   from contact in db.DealerContact
   where dealer.DealerID == contact.DealerID
   select dealerContact;

приведет к INNER JOIN в SQL

присоединиться полезен для IEnumerable, потому что он более эффективен:

from contact in db.DealerContact  

предложение будет повторно выполняться для каждого дилер Но для IQueryable это не так. Также присоединиться менее гибкий.

Вы создаете внешний ключ, а LINQ-to-SQL создает для вас свойства навигации. Каждый Dealer будет иметь набор DealerContacts, который вы можете выбирать, фильтровать и изменять.

from contact in dealer.DealerContacts select contact

или же

context.Dealers.Select(d => d.DealerContacts)

Если вы не используете свойства навигации, вы упускаете одно из основных преимуществ LINQ-to-SQL - часть, которая отображает граф объекта.

О боже, ты сэкономил мне время, мне больше не нужно иметь дело с этими дурацкими присоединениями!

Tomas 31.01.2013 19:16

Собственно, часто лучше не присоединяться, то есть в linq. Когда есть свойства навигации, очень краткий способ написать оператор linq:

from dealer in db.Dealers
from contact in dealer.DealerContacts
select new { whatever you need from dealer or contact }

Это переводится в предложение where:

SELECT <columns>
FROM Dealer, DealerContact
WHERE Dealer.DealerID = DealerContact.DealerID

Как LINQ-запрос с несколькими предложениями from (как в этом примере) выглядит в синтаксисе цепочки выражений? Является ли это возможным?

Jon Schneider 27.05.2015 23:07

Эквивалент синтаксиса метода - SelectMany().

Gert Arnold 03.04.2016 22:58

OperationDataContext odDataContext = new OperationDataContext();    
        var studentInfo = from student in odDataContext.STUDENTs
                          join course in odDataContext.COURSEs
                          on student.course_id equals course.course_id
                          select new { student.student_name, student.student_city, course.course_name, course.course_desc };

Где таблицы студентов и курсов имеют отношения первичного и внешнего ключей

Один лучший пример

Имена таблиц: TBL_Emp и TBL_Dep

var result = from emp in TBL_Emp join dep in TBL_Dep on emp.id=dep.id
select new
{
 emp.Name;
 emp.Address
 dep.Department_Name
}


foreach(char item in result)
 { // to do}

Используйте LINQ присоединяется для выполнения внутреннего соединения.

var employeeInfo = from emp in db.Employees
                   join dept in db.Departments
                   on emp.Eid equals dept.Eid 
                   select new
                   {
                    emp.Ename,
                    dept.Dname,
                    emp.Elocation
                   };

попробуйте вместо этого,

var dealer = from d in Dealer
             join dc in DealerContact on d.DealerID equals dc.DealerID
             select d;

Попробуй это :

     var data =(from t1 in dataContext.Table1 join 
                 t2 in dataContext.Table2 on 
                 t1.field equals t2.field 
                 orderby t1.Id select t1).ToList(); 

Чтобы расширить синтаксис цепочки выражений отвечать от Clever Human:

Если вы хотите сделать что-то (например, отфильтровать или выбрать) в полях из обеих таблиц, которые объединяются вместе, а не только на одной из этих двух таблиц, вы можете создать новый объект в лямбда-выражении последнего параметра метода Join включая обе эти таблицы, например:

var dealerInfo = DealerContact.Join(Dealer, 
                              dc => dc.DealerId,
                              d => d.DealerId,
                              (dc, d) => new { DealerContact = dc, Dealer = d })
                          .Where(dc_d => dc_d.Dealer.FirstName == "Glenn" 
                              && dc_d.DealerContact.City == "Chicago")
                          .Select(dc_d => new {
                              dc_d.Dealer.DealerID,
                              dc_d.Dealer.FirstName,
                              dc_d.Dealer.LastName,
                              dc_d.DealerContact.City,
                              dc_d.DealerContact.State });

Интересная часть - это лямбда-выражение в строке 4 этого примера:

(dc, d) => new { DealerContact = dc, Dealer = d }

... где мы создаем новый объект анонимного типа, который имеет в качестве свойств записи DealerContact и Dealer вместе со всеми их полями.

Затем мы можем использовать поля из этих записей при фильтрации и выборе результатов, как показано в оставшейся части примера, в котором dc_d используется в качестве имени для созданного нами анонимного объекта, который имеет записи DealerContact и Dealer в качестве своих свойств.

У объединений с лямбдами ужасный синтаксис. Я отказываюсь его использовать ;-)

Mariusz 11.10.2016 17:05

@aristo Я тебя вообще не виню. Обычно мне приходится возвращаться к этому посту, чтобы напомнить себе о синтаксисе!

Jon Schneider 11.10.2016 17:07

Некоторые люди вроде меня предпочитают последовательность. Вот почему я ищу именно лямбда-синтаксис.

0014 11.12.2018 23:22

Внутреннее объединение двух таблиц в linq C#

var result = from q1 in table1
             join q2 in table2
             on q1.Customer_Id equals q2.Customer_Id
             select new { q1.Name, q1.Mobile, q2.Purchase, q2.Dates }

var Data= (from dealer in Dealer join dealercontact in DealerContact on dealer.ID equals dealercontact.DealerID
select new{
dealer.Id,
dealercontact.ContactName

}).ToList();

var data=(from t in db.your tableName(t1) 
          join s in db.yourothertablename(t2) on t1.fieldname equals t2.feldname
          (where condtion)).tolist();

var list = (from u in db.Users join c in db.Customers on u.CustomerId equals c.CustomerId where u.Username == username
   select new {u.UserId, u.CustomerId, u.ClientId, u.RoleId, u.Username, u.Email, u.Password, u.Salt, u.Hint1, u.Hint2, u.Hint3, u.Locked, u.Active,c.ProfilePic}).First();

Напишите имена таблиц, которые вы хотите, и инициализируйте выбор, чтобы получить результат полей.

var list = (от u в db.Yourfirsttablename присоединиться к c в db.secondtablename на u.firsttablecommonfields равно c.secondtablecommon поле, где u.Username == username выберите новый {u.UserId, u.CustomerId, u.ClientId, u.RoleId , u.Username, u.Email, u.Password, u.Salt, u.Hint1, u.Hint2, u.Hint3, u.Locked, u.Active, c.ProfilePic}). First ();

Sarfraj Sutar 23.12.2017 10:50

var q=(from pd in dataContext.tblProducts join od in dataContext.tblOrders on pd.ProductID equals od.ProductID orderby od.OrderID select new { od.OrderID,
 pd.ProductID,
 pd.Name,
 pd.UnitPrice,
 od.Quantity,
 od.Price,
 }).ToList(); 

Добро пожаловать в Stack Overflow! Хотя этот фрагмент кода может решить вопрос, включая объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причины вашего предложения кода. Также постарайтесь не загромождать свой код пояснительными комментариями, так как это снижает удобочитаемость как кода, так и пояснений!

Goodbye StackExchange 29.01.2018 17:02

из d1 в DealerContrac присоединиться к d2 в DealerContrac на d1.dealearid равно d2.dealerid выбрать новый {дилерский контракт. *}

Добро пожаловать в Stack Overflow! Этот ответ ничего не добавляет к уже существующим ответам.

Jeroen Heier 09.08.2019 08:55

Другие вопросы по теме