Tengo una relación FK entre dos tablas, pero para el propósito de esta consulta, necesito obtener un recuento de filas para cada FK.

Por ejemplo, tengo una tabla CareTaker con CareTakerId como PK; y una tabla Animal con CareTakerId como FK. Dada una lista de CareTakerIds, quiero Todos los AnimalIds de los que cada cuidador es responsable. Algo como esto:

select CareTakerId, count(1) 
from Animal
where CareTakerId in (1,2,3,4)
    and AnimalTypeId = 3
group by CareTakerId

Que vuelve

CareTakerId | No ColumnName
1           | 42
2           | 6

¿Cómo hago esto en EntityFramework? Necesito este resultado, así que pensé en hacerlo como Dictionary<int,int> (Dictionary<CareTakerId,Count>), pero no puedo averiguar cómo escribir la consulta EF para él. Esto es lo que tengo hasta ahora:

query
    .Where(r => r.AnimalTypeId == animalTypeId 
             && careTakerIds.Contains(r => r.CareTakerId))
    .GroupBy(r => r.CareTakerId)
    // Not sure what to write here; r.CareTakerId doesn't exist
    .Select(r => new {r.key, r.value }) 
    .ToDictionary(kvp => kvp.Key, kvp => kvp.value);

¿Cómo selecciono CareTakerId y cuento (1) en el marco de la entidad, por favor?

3
LocustHorde 29 ene. 2016 a las 16:30

2 respuestas

La mejor respuesta

Estuviste muy cerca, simplemente agrega el método "Count ()".

query
    .Where(r => r.AnimalTypeId == animalTypeId 
             && careTakerIds.Contains(r => r.CareTakerId))
    .GroupBy(r => r.CareTakerId)
    .Select(r => new {r.key, value = r.Count() }) 
    .ToDictionary(kvp => kvp.Key, kvp => kvp.value);
3
Jonathan Magnan 29 ene. 2016 a las 13:50

Haz esto en tu Select:

//...
//You have groups here, 
//so you can call Count extension method to get how many elements belong to the current group
.Select(g => new {CareTakerId=g.Key,Count= g.Count() })
.ToDictionary(e=> e.CareTakerId,e=> e.Count);
5
octavioccl 29 ene. 2016 a las 14:12