C# 如何在where子句中使用LINQ Except()
我很难理解如何正确使用Except()我想在where子句中使用Except()来排除与字符串列表匹配的结果。我用下面这个小例子来说明 另外,在这种情况下使用“除此之外”是最快的方法吗?如果没有,什么会更快 我在哪里有这个:C# 如何在where子句中使用LINQ Except(),c#,linq,where,C#,Linq,Where,我很难理解如何正确使用Except()我想在where子句中使用Except()来排除与字符串列表匹配的结果。我用下面这个小例子来说明 另外,在这种情况下使用“除此之外”是最快的方法吗?如果没有,什么会更快 我在哪里有这个: var result = (from FunTable in Context.t_FunTable where FunTable.ft_FunStartDate >= startDate &&
var result = (from FunTable in Context.t_FunTable
where FunTable.ft_FunStartDate >= startDate
&& FunTable.ft_FunEndDate <= endDate
----> && FunTable.ft_FunStage != notAllowedStage1
----> && FunTabble.ft_FunStage != notAllowedStage2
select FunTable.ActivityName).ToList<String>();
var result = (from FunTable in Context.t_FunTable
where FunTable.ft_FunStartDate >= startDate
&& FunTable.ft_FunEndDate <= endDate
----> && FunTable.ft_FunStage.Except(ListOfNotAllowedStages)
select FunTable.ActivityName).ToList<String>();
var result=(来自Context.t\u FunTable中的FunTable
其中FunTable.ft_FunStartDate>=startDate
&&FunTable.ft\u FunEndDate和&FunTable.ft\u funtage!=不允许的阶段1
---->&&funtable.ft_funtage!=不允许的阶段2
选择FunTable.ActivityName).ToList();
我想这样做:
var result = (from FunTable in Context.t_FunTable
where FunTable.ft_FunStartDate >= startDate
&& FunTable.ft_FunEndDate <= endDate
----> && FunTable.ft_FunStage != notAllowedStage1
----> && FunTabble.ft_FunStage != notAllowedStage2
select FunTable.ActivityName).ToList<String>();
var result = (from FunTable in Context.t_FunTable
where FunTable.ft_FunStartDate >= startDate
&& FunTable.ft_FunEndDate <= endDate
----> && FunTable.ft_FunStage.Except(ListOfNotAllowedStages)
select FunTable.ActivityName).ToList<String>();
var result=(来自Context.t\u FunTable中的FunTable
其中FunTable.ft_FunStartDate>=startDate
&&FunTable.ft_FunEndDate和&FunTable.ft_funtage.Except(不允许的阶段列表)
选择FunTable.ActivityName).ToList();
您可以使用包含
:
!ListOfNotAllowedStage.Contains(FunTable.ft_FunStage)
或任何
:
!ListOfNotAllowedStage.Any(x => x == FunTable.ft_FunStage)
您可以使用
包含
:
!ListOfNotAllowedStage.Contains(FunTable.ft_FunStage)
或任何
:
!ListOfNotAllowedStage.Any(x => x == FunTable.ft_FunStage)
在我看来,你想要这个:
&& !ListOfNotAllowedStages.Contains(FunTable.ft_FunStage)
在我看来,你想要这个:
&& !ListOfNotAllowedStages.Contains(FunTable.ft_FunStage)
最佳解决方案由in给出,但要直接回答问题,必须注意方法是。因此,如果您真的想使用,您必须尝试以下方法:
var result = (from FunTable in Context.t_FunTable
where FunTable.ft_FunStartDate >= startDate
&& FunTable.ft_FunEndDate <= endDate)
.Except(Context.t_FunTable
.Where(x => ListOfNotAllowedStages.Contains(x.ft_FunStage))))
.Select(x => x.ActivityName);
var result=(来自Context.t\u FunTable中的FunTable
其中FunTable.ft_FunStartDate>=startDate
&&FunTable.ft_FunEndDate不允许的阶段列表。包含(x.ft_FunStage)))
.选择(x=>x.ActivityName);
正如你所看到的,它有点复杂,因此这不是解决这个问题的最佳方法。添加一个简单的条件
!ListOfNotAllowedStage.Contains(FunTable.ft\u FunStage)
到您的中,where
子句是最佳解决方案。最佳解决方案由in给出,但要直接回答问题,必须注意方法是。因此,如果您真的想使用,您必须尝试以下方法:
var result = (from FunTable in Context.t_FunTable
where FunTable.ft_FunStartDate >= startDate
&& FunTable.ft_FunEndDate <= endDate)
.Except(Context.t_FunTable
.Where(x => ListOfNotAllowedStages.Contains(x.ft_FunStage))))
.Select(x => x.ActivityName);
var result=(来自Context.t\u FunTable中的FunTable
其中FunTable.ft_FunStartDate>=startDate
&&FunTable.ft_FunEndDate不允许的阶段列表。包含(x.ft_FunStage)))
.选择(x=>x.ActivityName);
正如你所看到的,它有点复杂,因此这不是解决这个问题的最佳方法。添加一个简单的条件
!ListOfNotAllowedStage.Contains(FunTable.ft\u FunStage)
到您的where
子句,如所示,是最好的解决方案。就个人而言,我不喜欢查询表单(from…in…select…
)。.Where(..).Select(..)
通常更容易编写。就我个人而言,我不喜欢查询表单(from…in…Select…
)。.Where(..).Select(..)
通常更容易编写。这很有效。我发现首先编写要排除的目标是违反直觉的,或者我有点疯了?是的,但是在中使用名为IsContainedIn的LINQ方法可能会更糟。这样做的速度是否正确?我可以优化到O(1)吗?@RayExcept
在这种情况下肯定是错误的选择。而且它看起来像ft\u FunStage
是一个单一的值,所以你不能像你写的那样使用Except
。在这些情况下,只需使用Contains
。它将被翻译为notin
到SQL
,效果很好。我发现首先编写要排除的目标是违反直觉的,或者我有点疯了?是的,但是在
中使用名为IsContainedIn的LINQ方法可能会更糟。这样做的速度是否正确?我可以优化到O(1)吗?@RayExcept
在这种情况下肯定是错误的选择。而且它看起来像ft\u FunStage
是一个单一的值,所以你不能像你写的那样使用Except
。在这些情况下,只需使用Contains
。它将被翻译为notin
到SQL