C# 我是否可以将这段代码优化得更短?
我是否可以将这段代码优化为更短的代码? MakeList、TrimList等都是列表类型。 和车辆模型。 我的问题是代码很长。我在模型中有20个属性C# 我是否可以将这段代码优化得更短?,c#,entity-framework,filter,contains,C#,Entity Framework,Filter,Contains,我是否可以将这段代码优化为更短的代码? MakeList、TrimList等都是列表类型。 和车辆模型。 我的问题是代码很长。我在模型中有20个属性 对于LINQ to对象: public static class FilterExt { public static IEnumerable<TItem> ApplyFilter<TProp, TItem>(this IEnumerable<TItem> list, List<TProp>
对于LINQ to对象:
public static class FilterExt
{
public static IEnumerable<TItem> ApplyFilter<TProp, TItem>(this IEnumerable<TItem> list, List<TProp> filter, Func<TItem, TProp> prop)
{
if (filter == null || filter.Count == 0)
{
return list;
}
return list.Where(x => filter.Contains(prop.Invoke(x)));
}
}
...
var filtered = bidVehicles
.ApplyFilter(MakeList, x => x.Vehicle.Make)
.ApplyFilter(TrimList, x => x.Vehicle.Trim).ToList();
公共静态类过滤器文本
{
公共静态IEnumerable ApplyFilter(此IEnumerable列表、列表筛选器、Func属性)
{
if(filter==null | | filter.Count==0)
{
退货清单;
}
其中(x=>filter.Contains(prop.Invoke(x));
}
}
...
var过滤=车辆
.ApplyFilter(生成列表,x=>x.Vehicle.Make)
.ApplyFilter(TrimList,x=>x.Vehicle.Trim).ToList();
如果你使用EF(意思是
bidVehicles
是IQueryable
),你必须为每个属性编写表达式,因为你需要完整的谓词表达式
,而不仅仅是Func
和什么是MakeList,TrimList
等?@SeM-它们是List sir.简短的代码并不总是容易理解,您可以删除对==true的比较,除了我会更多地寻找重构代码之外,您似乎正在构建一个动态where子句,看看是否可以单独生成它。@Peeyussingh-是的,我正在构建动态where子句。如果我重构它,将附加太多的参数。问题是,您可以通过编写一些代码从技术上缩短这部分代码,这些代码可能会比这长,也可能不会比这长。If(filter?.Count==0)
@AnthonyQuartz我将方法设置为泛型以支持按不同类型筛选。我有一个错误:LINQ to Entities无法识别方法“System.String Invoke(BidVehicle)”方法,并且此方法无法转换为存储表达式。@AnthonyQuartz如何调用ApplyFilter
?“For LINQ to Entities”?我猜你的意思是LINQ to Objects,因为to Entities肯定意味着EF,因此IQueryable
。
public static class FilterExt
{
public static IEnumerable<TItem> ApplyFilter<TProp, TItem>(this IEnumerable<TItem> list, List<TProp> filter, Func<TItem, TProp> prop)
{
if (filter == null || filter.Count == 0)
{
return list;
}
return list.Where(x => filter.Contains(prop.Invoke(x)));
}
}
...
var filtered = bidVehicles
.ApplyFilter(MakeList, x => x.Vehicle.Make)
.ApplyFilter(TrimList, x => x.Vehicle.Trim).ToList();