lambda表达式中的条件c#

时间:2015-04-27 16:23:32

标签: c# linq lambda

我有像

这样的实体
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;
}

[以上代码抛出构建错误]

这里只有我遇到问题才能根据程序Ids数组参数获取EMetrics。

我想要与该计划相关联的列表Emetrics。

2 个答案:

答案 0 :(得分:4)

您在LINQ中错误地访问了相同的输入参数。应该通过更改内部Select来重构它以使用不同的参数:

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

    return metrics;
}

答案 1 :(得分:2)

所以你想检查一个集合的所有元素是否存在于另一个集合中。在LINQ中,可以使用Except和Any:

的组合来完成
var metrics = EntitySet
    .Where(x => x.Programs.Select(p => p.ID).Except(programIds).Any())
    .ToList();

Fyi - 你当前的代码失败了,因为Array.Contains期望单个项目,在这种情况下为int,而你给它一个完整的可枚举