C# 如何在where子句中使用LINQ 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 &&

我很难理解如何正确使用Except()我想在where子句中使用Except()来排除与字符串列表匹配的结果。我用下面这个小例子来说明

另外,在这种情况下使用“除此之外”是最快的方法吗?如果没有,什么会更快

我在哪里有这个:

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)吗?@Ray
Except
在这种情况下肯定是错误的选择。而且它看起来像
ft\u FunStage
是一个单一的值,所以你不能像你写的那样使用
Except
。在这些情况下,只需使用
Contains
。它将被翻译为
notin
SQL
,效果很好。我发现首先编写要排除的目标是违反直觉的,或者我有点疯了?是的,但是在
中使用名为
IsContainedIn的LINQ方法可能会更糟。这样做的速度是否正确?我可以优化到O(1)吗?@Ray
Except
在这种情况下肯定是错误的选择。而且它看起来像
ft\u FunStage
是一个单一的值,所以你不能像你写的那样使用
Except
。在这些情况下,只需使用
Contains
。它将被翻译为
notin
SQL