我在尝试进行此过滤时遇到了一些问题,并且我确信它可以比我正在做的更好。我将展示我的课程以及如何解决它,但我想知道我是否可以使用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;
}
}
我可以改善这一点并避免所有这些预测吗?
答案 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());