2015-04-27 6 views
2

У меня есть объект, какТам, где условие внутри лямбда-выражения C#

public class Program 
{  
    public int ID { get; set; } 
    public bool IsActive { get; set; } 
    public string Title { get; set; } 
} 

и

public class EMetrics 
{ 
    public int ID { get; set; } 
    public bool IsActive { get; set; } 
    public string Title { get; set; } 
    public List<Program> Programs { get; set; } 
} 

У меня есть метод хранилища, как,

IEnumerable<EMetrics> IEmetricsRepository.GetAllByProgram(params int[] programIds) 
{ 
    var metrics = EntitySet 
     .Where(x => programIds.Contains(x.Programs.Select(x => x.ID))) 
     .ToList(); 

     return metrics; 
} 

[Приведенный выше код бросать построить ошибку]

Здесь только wh Если я столкнулся с проблемой получения EMetrics на основе параметров массива Ids программы.

Я хочу, чтобы список Emetrics был связан с программой.

ответ

2

Так что вы хотите проверить, если все элементы одной коллекции присутствуют в других. В LINQ, что может быть сделано с комбинацией исключением и любой:

var metrics = EntitySet 
    .Where(x => x.Programs.Select(p => p.ID).Except(programIds).Any()) 
    .ToList(); 

Fyi - ваш текущий код не удается, потому что Array.Contains ожидает один элемент, в Int в этом случае, в то время как вы даете ему всю перечислимую

4

Вы неправильно используете один и тот же входной параметр в LINQ. Она должна быть переработана, изменив ваш внутренний Выберите, чтобы использовать другой параметр:

IEnumerable<EMetrics> IEmetricsRepository.GetAllByProgram(params int[] programIds) 
{ 
    var metrics = EntitySet 
     .Where(x => programIds.Contains(x.Programs.Select(y => y.ID))) 
     .ToList(); 

    return metrics; 
} 
Смежные вопросы