如果该值"any",如何避免检查特定'linq where clause'?



我有以下LINQ查询:

SailingMain_Details = SailingMain_Details.Where(f => f.Duration == durationCr_Filter 
&& f.DeparturePortID == depPortCr_Filter 
&& f.CruiseLine == cruLineCr_Filter 
&& f.ShipName == cruShipCr_Filter 
&& f.DestinationCr == destinationCr_Filter).ToList();

在上面的查询中,有时我会得到一些参数值,例如 value=="any"。 在这种情况下,我想避免只检查该参数。谁能指导我如何做到这一点。谢谢。

如果您想跳过过滤器为"任何"的条件,则以下内容可能有效

SailingMain_Details =
SailingMain_Details.Where(f => (durationCr_Filter != "any" ? f.Duration == durationCr_Filter : true)
&& (depPortCr_Filter != "any" ? f.DeparturePortID == depPortCr_Filter : true)
&& (cruShipCr_Filter != "any" ? f.ShipName == cruShipCr_Filter : true)
&& (cruLineCr_Filter != "any" ? f.CruiseLine == cruLineCr_Filter : true)
&& (destinationCr_Filter != "any" ? f.DestinationCr == destinationCr_Filter : true)).ToList();

为了实现您想要的,让我通过DeparturePortID示例向您展示。假设"任何"价值 eis-1

SailingMain_Details = SailingMain_Details
.Where(f => 
f.Duration == durationCr_Filter 
&& (depPortCr_Filter == -1 || f.DeparturePortID == depPortCr_Filter)
&& f.CruiseLine == cruLineCr_Filter 
&& f.ShipName == cruShipCr_Filter 
&& f.DestinationCr == destinationCr_Filter)
.ToList();

在这里,如果depPortCr_Filter-1,则(depPortCr_Filter == -1 || f.DeparturePortID == depPortCr_Filter)的计算结果是true,与f.DeparturePortID == depPortCr_Filter条件无关。

分别应用每个过滤器。

示例
if(durationCr_Filter.toUpper() != "ANY")
SailingMain_Details = SailingMain_Details.Where(f => f.Duration == durationCr_Filter);
if(depPortCr_Filter.toUpper() != "ANY")
SailingMain_Details = SailingMain_Details.Where(f => f.DeparturePortID == depPortCr_Filter);
if(cruLineCr_Filter.toUpper() != "ANY")
SailingMain_Details = SailingMain_Details.Where(f => f.CruiseLine == cruLineCr_Filter);
if(cruShipCr_Filter.toUpper() != "ANY")
SailingMain_Details = SailingMain_Details.Where(f => f.ShipName == cruShipCr_Filter);
if(destinationCr_Filter.toUpper() != "ANY")
SailingMain_Details = SailingMain_Details.Where(f => f.DestinationCr == destinationCr_Filter);

我假设这里的一些参数意味着它可以用于这 5 个参数中的任何一个,所以你可以尝试类似的东西

SailingMain_Details = SailingMain_Details.Where(f => (f.Duration == durationCr_Filter || durationCr_Filter == "any") 
&& (f.DeparturePortID == depPortCr_Filter ||  depPortCr_Filter == "any")  &&
(f.CruiseLine == cruLineCr_Filter || cruLineCr_Filter == "any")  && (f.ShipName == cruShipCr_Filter || cruShipCr_Filter == "any")  &&
(f.DestinationCr == destinationCr_Filter || destinationCr_Filter == "any") ).ToList();

你可以这样做

if (SailingMain_Details.Any(x => x.value == "any"))
{
// avoid the check here
SailingMain_Details = SailingMain_Details.Where(f => f.Duration == durationCr_Filter && f.DeparturePortID == depPortCr_Filter && f.CruiseLine == cruLineCr_Filter && f.ShipName == cruShipCr_Filter && f.DestinationCr == destinationCr_Filter).ToList();
}
else
{
SailingMain_Details = SailingMain_Details.Where(f => f.Duration == durationCr_Filter && f.DeparturePortID == depPortCr_Filter && f.CruiseLine == cruLineCr_Filter && f.ShipName == cruShipCr_Filter && f.DestinationCr == destinationCr_Filter).ToList();
}

例如避免检查意味着默认情况下它基本上应返回true。 对于一个项目,请参见下文。其他可以遵循相同的

&& (depPortCr_Filter == 'any' || f.DeparturePortID == depPortCr_Filter(.

最新更新