过滤LINQ子集合EF

时间:2013-12-18 13:47:21

标签: c# linq entity-framework

我在尝试进行此过滤时遇到了一些问题,并且我确信它可以比我正在做的更好。我将展示我的课程以及如何解决它,但我想知道我是否可以使用Linq来过滤它。我的课程:

public class Section
{
    public int Id { get; set; }    
    public string Name { get; set; }    
    public int Order { get; set; }

    public virtual List<FeatureType> Features { get; set; }
}

public class ItemType
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<FeatureType> FeatureTypes { get; set; }

    public override string ToString()
    {
        return Name;
    }    
}

public class FeatureType
{
    public int Id { get; set; }    
    public string Name { get; set; }    
    public Section Section { get; set; }

    public virtual List<ItemType> ItemTypes { set; get; }
}

我正在尝试获取所有Sections,并按ItemTypeID过滤功能,因此仅列出该ItemTypes的FeatureTypes。我现在正在做的只是获取所有部分,并且只是做一个for而只是添加那些对我有用的部分:

public ItemTypeFeatureViewModel(int myItemTypeId, IUnitOfWork myUnitOfWork)
{
    ItemTypeId = myItemTypeId;
    unitOfWork = myUnitOfWork;
    Sections = unitOfWork.SectionRepository.Get(includeProperties: "Features")
                         .ToList();

    foreach (var item in Sections)
    {
        var x = new List<FeatureType>();
        foreach (var feature in item.Features)
        {
            foreach (var itemType in feature.ItemTypes)
            {
                if (itemType.Id == ItemTypeId)
                {
                    x.Add(feature);
                    break;
                }
            }
        }
        item.Features = x;
    }
}

我可以改善这一点并避免所有这些预测吗?

2 个答案:

答案 0 :(得分:3)

您不能在服务器端过滤掉包含的集合,但可以用以下内容替换两个内部循环:

item.Features = item.Features
                    .Where(f => f.ItemTypes.Any(i => i.Id == ItemTypeId))
                    .ToList();

这将仅选择至少具有您提供的ID的项目类型的那些功能。

答案 1 :(得分:1)

尝试以下方法:

Sections
    .ForEach(x => x.Features = x.Features.Where(y => y.Any(z => z.Id == ItemTypeId))
    .ToList());