2011-02-10 28 views
5

Hola, ¿puedo saber cómo hacer una condición selectiva de "caso" al usar linq? El código comentado es mi pregunta. ¿cómo pongo la condición allí? mi código:linq join with case condition

var r = from u in Users 
    join p in Payments on u.Id equals p.UserId 
    join soi in SaleOrderItems on p.ReferenceId equals soi.Id 
      //if soi.InventoryTypeId == 1 
       //then join i in Inventories on soi.InventoryOrCourseId equals i.Id 
      //elseif soi.InventorytypeId ==2 
       //then join c in Courses on soi.InventoryOrCourseId equals c.Id 
    where u.Id == 5 
    select new{ u, p, soi, either i or c}; 

Respuesta

2

usted tiene que utilizar alguna combinación externa truco para lograr esto, un método sencillo es a través de DefaultIfEmpty(). Esencialmente se crea una combinación interna luego expandirlo con filas faltantes:

var r = from u in Users 
    join p in Payments on u.Id equals p.UserId 
    join soi in SaleOrderItems on p.ReferenceId equals soi.Id 
    join i in Inventories on new {a = soi.InventoryTypeId, b = soi.InventoryOrCourseId } equals new {a = 1, b = i.Id} into g1 
    from oi in g1.DefaultIfEmpty() 
    join c in Courses on new {a = soi.InventoryTypeId, b = soi.InventoryOrCourseId } equals new {a = 2, b = c.Id} into g2 
    from oc in g2.DefaultIfEmpty() 
    where u.Id == 5 
    select new{ u, p, soi, ic = oi ?? oc}; 

tener cuidado con esta última afirmación ic = oi ?? oc, ya que los tipos se diferencian del tipo anónimo utilizará declaración System.Object por lo que puede acomodar ambos tipos, si Si desea utilizar un soporte tipado sólido, una mejor opción sería devolver tanto oc como ic y luego probar. Debería decidir mejor sobre la base de cómo utiliza esta consulta late ron.

+0

@mmix hi recibí este error "El tipo de una de las expresiones en la cláusula join es incorrecta. Error en la inferencia de tipo en la llamada a 'GroupJoin'." en la línea join i en Inventarios en new {a ... – VeecoTech

+0

¿Qué tipo es 'soi.InventoryTypeId'? Como imagino que 'type (soi.InventoryOrCourseId)' es igual a 'type (Inventory.Id)', entonces debe ser que 'soi.InventoryTypeId' no sea' int'. Si es así, decore las constantes 1 y 2 con un sufijo de tipo apropiado (U, L, etc.) – mmix

+0

@mmix: sí, ambos son exactamente int – VeecoTech