Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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# 如何删除串联linq/lambda表达式中的冗余执行路径_C#_Entity Framework_Linq_Lambda - Fatal编程技术网

C# 如何删除串联linq/lambda表达式中的冗余执行路径

C# 如何删除串联linq/lambda表达式中的冗余执行路径,c#,entity-framework,linq,lambda,C#,Entity Framework,Linq,Lambda,这是根据条件将这些linq/lambda语句连接在一起的最佳方法吗?这样我就不必在同一件事上参加那么多次了 我不是专家,但好像有多余的?也许执行路径不是最有效的! 前 我将保留每个联接的第一次出现的结果,并向下传递联接结果 var ProdsProdDef = from p in context.Products join pd in context.ProductDefendant on p.Id equals pd.ProductId

这是根据条件将这些linq/lambda语句连接在一起的最佳方法吗?这样我就不必在同一件事上参加那么多次了

我不是专家,但好像有多余的?也许执行路径不是最有效的! 前


我将保留每个
联接的第一次出现的结果,并向下传递联接结果

var ProdsProdDef = from p in context.Products
                   join pd in context.ProductDefendant on p.Id equals pd.ProductId
                   select new { p, pd };

if (input.DefendantId != null) {
    ProdsProdDef = from ppd in ProdsProdDef
                   where ppd.pd.DefendantId == input.DefendantId
                   select ppd;
}

var ProdsProdDefDef = from ppd in ProdsProdDef
                      join d in context.Defendants on ppd.pd.DefendantId equals d.Id
                      select new { ppd.p, ppd.pd, d };

if (input.DefendantCode != null && input.DefendantId == null) {
    ProdsProdDefDef = from ppdd in ProdsProdDefDef
                      where ppdd.d.DefendantCode.Any(rp => EF.Functions.Like(ppdd.d.DefendantCode, "%" + input.DefendantCode + "%"))
                      select ppdd;
}

if (input.ProductId != null) {
    ProdsProdDefDef = ProdsProdDefDef.Where(ppdd => ppdd.p.Id == input.ProductId);
}

if (input.ProductName != null && input.ProductId == null) {
    ProdsProdDefDef = ProdsProdDefDef.Where(ppdd => EF.Functions.Like(ppdd.p.ProductName, "%" + input.ProductName + "%"));
}

var productsVM = from ppdd in ProdsProdDefDef
                 select new GetProductsReturnViewModel {
                     Id = ppdd.p.Id,
                     ProductName = ppdd.p.ProductName,
                     DefendantCode = ppdd.d.DefendantCode
                 };

我将保留每个
联接的第一次出现的结果,并向下传递联接结果

var ProdsProdDef = from p in context.Products
                   join pd in context.ProductDefendant on p.Id equals pd.ProductId
                   select new { p, pd };

if (input.DefendantId != null) {
    ProdsProdDef = from ppd in ProdsProdDef
                   where ppd.pd.DefendantId == input.DefendantId
                   select ppd;
}

var ProdsProdDefDef = from ppd in ProdsProdDef
                      join d in context.Defendants on ppd.pd.DefendantId equals d.Id
                      select new { ppd.p, ppd.pd, d };

if (input.DefendantCode != null && input.DefendantId == null) {
    ProdsProdDefDef = from ppdd in ProdsProdDefDef
                      where ppdd.d.DefendantCode.Any(rp => EF.Functions.Like(ppdd.d.DefendantCode, "%" + input.DefendantCode + "%"))
                      select ppdd;
}

if (input.ProductId != null) {
    ProdsProdDefDef = ProdsProdDefDef.Where(ppdd => ppdd.p.Id == input.ProductId);
}

if (input.ProductName != null && input.ProductId == null) {
    ProdsProdDefDef = ProdsProdDefDef.Where(ppdd => EF.Functions.Like(ppdd.p.ProductName, "%" + input.ProductName + "%"));
}

var productsVM = from ppdd in ProdsProdDefDef
                 select new GetProductsReturnViewModel {
                     Id = ppdd.p.Id,
                     ProductName = ppdd.p.ProductName,
                     DefendantCode = ppdd.d.DefendantCode
                 };

上半部分中的半联接似乎可以从内部查询中移出。除此之外,它看起来确实不错。如果GetProductsReturnViewModel不是模型的一部分,您可能会考虑缓存它们。我认为我遇到的问题是,当我具有input.DefensantCode!=null&&input.Defensanti==null,并且该部分使用where子句很好,但是如果条件input.ProductName!=null&&input.ProductId==null用于覆盖where子句。所以基本上,如果两个条件都满足,我需要两个where子句,目前只使用一个。我只能通过查看输出窗口来查看正在运行的sql是什么,该子句是如何被重写的?应用于已筛选IQueryable的where应导致一个包含两个条件(并连接)的IQueryable。上部的半联接似乎可以从内部查询中移出。除此之外,它看起来确实不错。如果GetProductsReturnViewModel不是模型的一部分,您可能会考虑缓存它们。我认为我遇到的问题是,当我具有input.DefensantCode!=null&&input.Defensanti==null,并且该部分使用where子句很好,但是如果条件input.ProductName!=null&&input.ProductId==null用于覆盖where子句。所以基本上,如果两个条件都满足,我需要两个where子句,目前只使用一个。我只能通过查看输出窗口来查看正在运行的sql是什么,该子句是如何被重写的?应用于已过滤iQueryTable的应导致iQueryTable包含这两个条件(并连接)