C# 如何删除串联linq/lambda表达式中的冗余执行路径
这是根据条件将这些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
我将保留每个
联接的第一次出现的结果,并向下传递联接结果
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包含这两个条件(并连接)