Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我是否可以将这段代码优化得更短?_C#_Entity Framework_Filter_Contains - Fatal编程技术网

C# 我是否可以将这段代码优化得更短?

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>

我是否可以将这段代码优化为更短的代码? MakeList、TrimList等都是列表类型。 和车辆模型。 我的问题是代码很长。我在模型中有20个属性


对于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();