2008-09-01 22 views
357

Escribo una instrucción LINQ to SQL, y busco la sintaxis estándar para una unión interna normal con una cláusula ON en C#.¿Cuál es la sintaxis para una unión interna en LINQ to SQL?

¿Cómo se representan los siguientes en LINQ a SQL:

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

Puede encontrar [consultas SQL en LINQ] (http://www.codeducky.org/sql-queries-in-linq/#inner-join) útiles.Explica cómo convertir consultas SQL comunes, incluidas combinaciones internas, en la sintaxis de LINQ. –

+0

Si tiene una clave externa entre las tablas, debe buscar la respuesta de Kirk Broadhurst a continuación. – Guilherme

+1

Debe pluralizar los nombres de su tabla. Una tabla que contiene (entradas sobre) muchos distribuidores debe llamarse * distribuidores *, y no distribuidor. – ANeves

Respuesta

470

Es algo parecido a:

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

Sería bueno tener nombres sensibles y campos de las tablas para una mejor ejemplo. :)

actualización

pienso para su búsqueda esto podría ser más apropiado:

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

Desde que busca los contactos, no los concesionarios.

+3

gracias, a partir de ahora voy a utilizar ** nombres razonables ** como mejor práctica que tiene sentido en linq, en lugar de 'desde c o desde t1' – stom

25

Uso Linq Join operador:

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

¿qué hacer cuando quiero columnas de ambos d & dc? –

+0

@KuntadyNithesh A continuación, devuelve una clase que hayas creado, como seleccionar nuevo MyCustomer {Id = dc.id, Id2 = d.id} ¡Eso es todo! – Elisabeth

36
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(); 
+0

Hola, ¿Puede decirme por favor de qué se trata esta parte? Estado = (ContactStatus) c.StatusID Estoy interesado EXPECIALLY en el fragmento: (ContactStatus) c.StatusID Saludos Mariusz – Mariusz

+0

@aristo - mirar el código, que supongo que es 'ContactStatus' realmente una enumeración, y 'c.StatusID' no es realmente una ID, sino el valor numérico de la enumeración. Si estoy en lo cierto, '(ContactStatus) c.StatusID' realmente está lanzando un entero a una enumeración. –

190

Y porque prefiero la sintaxis de la cadena de expresión, aquí es cómo lo haces con eso:

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

Si necesita filtrar o seleccionar en campos de * ambas * tablas unidas, en lugar de simplemente en los campos de una de las dos tablas (la tabla DealerContact en el ejemplo de esta respuesta), aquí hay un ejemplo: http://stackoverflow.com/ a/29310640/12484 –

22

básicamente LINQ unen operador proporciona sin beneficio para SQL. Es decir. la siguiente consulta

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

dará lugar a INNER JOIN en SQL

unen es útil para IEnumerable <> porque es más eficiente:

from contact in db.DealerContact 

cláusula sería re-ejecutados por cada distribuidor Pero para IQueryable <> no es el caso. También join es menos flexible.

18

Crea una clave externa y LINQ-to-SQL crea propiedades de navegación para usted. Cada Dealer tendrá una colección de DealerContacts que puede seleccionar, filtrar y manipular.

from contact in dealer.DealerContacts select contact 

o

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

Si usted no está utilizando las propiedades de navegación, que se está perdiendo uno de los principales beneficios de LINQ a SQL - la parte que mapea el gráfico de objetos.

+0

¡Oh hombre, me salvaste el tiempo, ya no necesito lidiar con estas estúpidas uniones! – Tomas

9

En realidad, a menudo es mejor no unirse, en linq eso es.Cuando hay propiedades de navegación de una manera muy sucinta a escribir su declaración de LINQ es:

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

Se traduce en una cláusula where:

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

¿Qué aspecto tiene una consulta LINQ con varias cláusulas "de" (como en este ejemplo) en la sintaxis de la cadena de expresiones? ¿Es posible? –

+1

Su equivalente de sintaxis de método es 'SelectMany()'. –

1
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 }; 

donde las mesas estudiantes y los cursos tienen clave principal y extranjera relación clave

-7

Una mejor ejemplo

nombres de tabla: TBL_Emp y 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} 
+4

Lea este artículo de preguntas frecuentes: [¿Puedo promocionar productos o sitios web a los que estoy afiliado?] (Http://stackoverflow.com/faq#promotion). – Artemix

+2

El tipo que está utilizando en el foreach (char) no funcionará. – SRO

2

Uso LINQ joins para realizar combinación interna.

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 
        }; 
1

tratan en lugar de esto,

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

Prueba esto:

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

Para extender la sintaxis de la cadena de expresión answer por Clever humana:

Si quería hacer las cosas (como filtrar o seleccionar) en los campos de ambas tablas que se unen, en cambio en solo uno de esos dos mesas - se podría crear un nuevo objeto en la expresión lambda del parámetro final para el método de Ingreso incorporación de estos dos tablas, por ejemplo:

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 }); 

La parte interesante es la expresión lambda en la línea 4 de la citada ejemplo:

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

... donde se construye un nuevo objeto de tipo anónimo que tiene como propiedades de los registros distribuidorContacto y el distribuidor, junto con todos sus campos.

Podemos entonces usar campos de esos registros a medida que filtramos y seleccionamos los resultados, como lo demuestra el resto del ejemplo, que usa dc_d como nombre del objeto anónimo que creamos que tiene los registros DealerContact y Dealer como sus propiedades.

+2

Las uniones con lambdas tienen una sintaxis horrible. Me niego a usarlo ;-) – Mariusz

+5

@aristo No te culpo en absoluto. ¡Por lo general, me tengo que referir de nuevo a esta publicación para recordarme la sintaxis! –

-1

interior unir dos tablas en LINQ C#

var result =
de Q1 en la Tabla 1
unen a q2 en tabla2
en q1.Customer_Id es igual a q2.Customer_Id
seleccione nueva {q1.Name, Q1. móvil, q2.Purchase, q2.Dates}

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

}).ToList(); 
0
var data=(from t in db.your tableName(t1) 
      join s in db.yourothertablename(t2) on t1.fieldname equals t2.feldname 
      (where condtion)).tolist(); 
0
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(); 

Escriba los nombres de la tabla que desee e inicialice la selección para obtener el resultado de los campos.

+0

lista var = (de u en db.Yourfirsttablename unirse a c en db.secondtablename en u.firsttablecommonfields equivale campo c.secondtablecommon donde u.Username == nombre de usuario seleccionar nueva {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() ; –

1
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(); 
+0

¡Bienvenido a Stack Overflow! Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. Por favor, intente no saturar su código con comentarios explicativos, ya que esto reduce la legibilidad tanto del código como de las explicaciones. – FrankerZ

Cuestiones relacionadas