2011-02-15 14 views
47

Parece que hay diferentes maneras de hacer combinaciones usando linq. Uno de ellos es más sencillo e implica tablas simplemente se unen de esta manera:Entityframework Unir usando el método de unión y lambdas

var found = from c in s.categories 
      join cm in s.categorymaps on c.CategoryId equals cm.ChildCategoryId 
      select c; 

Hay otra manera usando lambdas y estoy teniendo una diablos de un tiempo tratando de encontrar la manera de unirse con esta sintaxis. ¿Alguien puede proporcionar enlaces a explicaciones detalladas y muchos ejemplos? ¿O simplemente demuestra usando ejemplos cómo usar esta sintaxis bastante confusa?

var x = _session.All<category>().Join<categorymap,category, .... 

Respuesta

11

Puede encontrar algunos ejemplos here:

// Fill the DataSet. 
DataSet ds = new DataSet(); 
ds.Locale = CultureInfo.InvariantCulture; 
FillDataSet(ds); 

DataTable contacts = ds.Tables["Contact"]; 
DataTable orders = ds.Tables["SalesOrderHeader"]; 

var query = 
    contacts.AsEnumerable().Join(orders.AsEnumerable(), 
    order => order.Field<Int32>("ContactID"), 
    contact => contact.Field<Int32>("ContactID"), 
    (contact, order) => new 
    { 
     ContactID = contact.Field<Int32>("ContactID"), 
     SalesOrderID = order.Field<Int32>("SalesOrderID"), 
     FirstName = contact.Field<string>("FirstName"), 
     Lastname = contact.Field<string>("Lastname"), 
     TotalDue = order.Field<decimal>("TotalDue") 
    }); 


foreach (var contact_order in query) 
{ 
    Console.WriteLine("ContactID: {0} " 
        + "SalesOrderID: {1} " 
        + "FirstName: {2} " 
        + "Lastname: {3} " 
        + "TotalDue: {4}", 
     contact_order.ContactID, 
     contact_order.SalesOrderID, 
     contact_order.FirstName, 
     contact_order.Lastname, 
     contact_order.TotalDue); 
} 

O simplemente google para 'LINQ unen sintaxis del método'.

+0

Gracias a todos por su ayuda. Encontré este enlace muy útil que realmente explica el método join() bastante complejo, así que pensé en compartirlo para que otros lo aprendieran – Mason

+2

@Mason - Si lo encuentras útil, vota mi respuesta –

124

Generalmente prefiero la sintaxis lambda con LINQ, pero Join es un ejemplo en el que prefiero la sintaxis de consulta, puramente para la legibilidad.

Sin embargo, aquí es el equivalente de la consulta anterior (creo, no probado):

var query = db.Categories   // source 
    .Join(db.CategoryMaps,   // target 
     c => c.CategoryId,   // FK 
     cm => cm.ChildCategoryId, // PK 
     (c, cm) => new { Category = c, CategoryMaps = cm }) // project result 
    .Select(x => x.Category); // select result 

Es posible que tenga que jugar con la proyección en función de lo que desea devolver, pero esa es la jist de ella .

+0

La mejor explicación que encontré hasta ahora, estaba capaz de resolver mis problemas de unión, gracias – Manny

+1

¿Quién en MS se sentó allí y decidió que esta sintaxis es sensata? Quiero encontrarlo y hacerle una pregunta o dos – DanteTheSmith

+0

Una de las desventajas de este código es la clase anónima que obtienes de Join, que luego hace que los resultados sean difíciles de pasar, por ejemplo, a una vista, controlador o marco de eventos. . Me gusta escribir clases intermedias explícitas, con exactamente la combinación de propiedades que me importa en Join. El resultado es que obtengo un tipado fuerte y un mejor rendimiento de SQL porque la lista de columnas devuelta es más limitada que las filas completas. –

Cuestiones relacionadas