2012-10-04 52 views
6

Estoy convirtiendo una consulta SQL en LINQ que crea una combinación izquierda con asignación 1 a 1, y tiene que estar en la sintaxis del método. Me he estado quitando el pelo tratando de lograr esto sin ningún tipo de velo. Puedo hacerlo en la sintaxis Lambda. A continuación se muestra la consulta de ejemplo que estoy tratando de ejecutar. No son códigos reales. ¿Alguien señalaría lo que estoy haciendo mal?JOIN e IZQUIERDA UNID equivalente en LINQ con la sintaxis del método

SQL:

SELECT item.*, item_status.* 
FROM item 
LEFT JOIN item_status 
    ON item.ID = item_status.itemID 
    AND item_status.FLAGGED = true 
WHERE item.published_date > "2008-06-19" 

LINQ:

var linq_query = (
    from selected_item in item 
    join selected_item_status in item_status 
     on selected_item.ID equals item_status.itemID into joined 
    from item_status in joined.DefaultIfEmpty() 
    where item_status.FLAGGED = true 
    select new {selected_item, selected_item_status}).ToList(); 
+0

¿Cómo podemos decirle qué le pasa a su código si no es realmente el código? ¿Podemos también ver la clase 'Item',' item_status', y la clase en la que pones la lista de tipo anónimo, por favor? –

Respuesta

8

El join ... into se convierte en un GroupJoin y la segunda from se convierte en un SelectMany:

var linq_query = Item 
    .GroupJoin(
     item_status.Where(x => x.selected_item_status.FLAGGED), // EDIT: Where clause moved here. 
     selected_item => selected_item.ID, 
     selected_item_status => selected_item_status.itemID, 
     (selected_item, joined) => new 
     { 
      selected_item, 
      statuses = joined.DefaultWithEmpty(), 
     }) 
    .SelectMany(x => x.statuses.Select(selected_item_status => new 
    { 
     x.selected_item, 
     selected_item_status, 
    })) 
    // EDIT: Removed where clause. 
    .ToList(); 

Parece que la Where hace la izquierda unión externa innecesaria, como n Los estados de ull se eliminarán de todos modos.

EDITAR: No, al revisar el SQL parece que su consulta LINQ es ligeramente incorrecta. Debería ser:

var linq_query = (
    from selected_item in item 
    join selected_item_status 
     in (
      from status in item_status 
      where status.FLAGGED 
      select status) 
     on selected_item.ID equals item_status.itemID into joined 
    from item_status in joined.DefaultIfEmpty() 
    select new {selected_item, selected_item_status}).ToList(); 
+0

¡Gracias! Nunca se me ocurrió tener la cláusula where en la mesa unida allí. – s1300045

+0

Gracias por esto, acabo de recibir esta respuesta y es lo que Iw está buscando. Mientras lo pienso, colocando la cláusula where en ese punto más similar al SQl que a la sintaxis del método linq. – EGP

Cuestiones relacionadas