2011-05-11 10 views
8

tengo lista de MiObjeto que tiene este aspecto:lista se unen con LINQ a SQL consulta

public class MyObject{ 
    public int FruitID {get;set;} 
    public string FruitName {get;set;} 
} 

List<MyObject> TheList = new List<MyObject>(); 

Esta lista se rellena con una consulta LINQ a SQL. Estoy buscando crear una unión entre esta lista y una tabla que contenga FruitID como su clave externa.

Los HarvestTimes de mesa se ve así:

FruitID | HarvestDatetime | RipeFactor 
    3  |  3/4/2011 |  2 
    3  |  4/5/2011 |  4 
    3  |  5/5/2011 |  3 
    4  |  3/21/2011 |  2 
    4  |  4/10/2011 |  2 
    4  |  5/10/2011 |  2 

Esto es lo que tengo hasta ahora:

var TheQuery = (from list in TheList 
       join fruit in MyDC.HarvestTimes on 
       list.FruitID equals fruit.FruitID 
       where .... 
       select new MyObject{... }).ToList(); 

Estoy tienen algunos problemas con la cláusula WHERE. ¿Cómo obtengo solo la Fruta donde el RipeFactor siempre fue 2. Por ejemplo, Fruit 3 tiene un RipeFactor de 2 pero también tiene 4 y considerando que solo Fruit4 tiene solo 2s. Intenté con Contiene pero aparecen ambas frutas.

Gracias por sus sugerencias.

+0

No estoy seguro si es posible, Comprar Probar la agrupación por FruitID, factor de Maduro, a continuación, contar el número de filas en cada Grupo FruitID, si el recuento es 1 y el factor maduro es el que desea, selecciónelo ... – atoMerz

+0

¿TheList está lleno del mismo DataContext que existe en HarvestTimes? – Magnus

+0

@Magnus, sí, mismo DC – frenchie

Respuesta

3

suponiendo que hay una relación entre las tablas HaverstTime y frutas:

var TheQuery = MyDC.HarvestTimes 
    .Where(p => TheList.Select(q => q.FruitID).Contains(p.FruitID)) 
    .GroupBy(p => p.Fruit) 
    .Where(p => p.All(q => q.RipeFactor == 2)) 
    .Select(p => p.Key); 

Esto creará un IEnumerable<Fruit>, que creo que se puede convertir fácilmente a MyObject.

Actualización: Vaya, olvidé agregar TheList.Select (q => q.FruitID). Es por eso que no compiló. = lo siento)

Update2: hacer lo mismo, teniendo en cuenta Ripefactor = 2 y 3

var TheQuery = MyDC.HarvestTimes 
    .Where(p => TheList.Select(q => q.FruitID).Contains(p.FruitID)) 
    .GroupBy(p => p.Fruit) 
    .Where(p => p.All(q => q.RipeFactor == 2 || q.RipeFactor == 3)) 
    .Select(p => p.Key); 
+0

¿Debería ser .GroupBy (p => p.FruitID)? – frenchie

+0

Por alguna razón, la instrucción .Where (p => TheList.Contains (p.FruitID)) está subrayada en rojo. – frenchie

+0

Depende. Pensé que querías seleccionar el objeto Fruit, no el FruitID. En ese caso, puede hacer GroupBy (p => p.FruitID), debería funcionar también. – Francisco

1

creo que esto funcionaría

var fruit = (from list in TheList 
      join fruit in 
       (from fr in MyDc.HarvestTimes 
       group fr by fr.FruitID into fg 
       where !fg.Any(f => f.RipeFactor != 2) 
       select fg) 
      on list.FruitID equals fruit.Key 
      select new MyObject{... }).ToList(); 

Actualización - Si sólo desea devolver la lista distinta de FruitIDs es necesario seleccionar fg.Key en lugar de fg

var fruit = (from list in TheList 
      join fruit in 
       (from fr in MyDc.HarvestTimes 
       group fr by fr.FruitID into fg 
       where !fg.Any(f => f.RipeFactor != 2) 
       select fg.Key) 
       on list.FruitID equals fruit 
       select new MyObject{... }).ToList(); 
+0

Sí, eso funciona en el sentido de que solo devuelve Fruit4. Lo miré de nuevo y luego me di cuenta de que estaba devolviendo todos los registros de Fruit4 en lugar de solo uno. Creo que no estaba claro en eso, mi mal. ¿Trabajaría solo en este caso? – frenchie

+0

@frenchie - Actualicé la respuesta. ¿Es esto lo que estás buscando? – Aducci

+0

No sé por qué, pero sigue mostrando duplicados. – frenchie

Cuestiones relacionadas