2014-01-17 58 views
0

这是我的LINQ(EF):LINQ不读书圆括号

var ls = from ps in ctx.Package_Services 
    where 
     (ps.Package.Policy.Name != "Short-Term Career Policy" 
      && ps.Package.Name != "Early Talent Package") 
     && 
     (ps.Package.Policy.Name != "Assignment Policy" 
      && ps.Package.Name != "Efficient Package") 
    select new 
    { 
     Service = ps.Service, 
     PackageService = ps 
    }; 

这是它产生的相关的SQL:

WHERE (N'Early Talent Package' <> [Extent2].[Name]) 
AND (N'Efficient Package' <> [Extent2].[Name]) 
AND (N'Short-Term Career Policy' <> [Extent3].[Name]) 
AND (N'Assignment Policy' <> [Extent4].[Name]) 

我想要说的是,“我不我不想组合X,我也不想组合Y;但是,我确实需要“早期人才套餐”,他们没有与“短期就业政策”联系在一起。而且,我也想要“高效套餐”不与“分配政策”相关联。

如何将它转换成LINQ?

+0

如果去掉括号中的逻辑仍然是相同的。尝试将括号外的'&&改为'||',我期望它能够保留它们。 – Jonesopolis

+0

如果我将'&&'更改为'||',它包含了所有的东西,就好像我根本没有'where'一样。 – user1477388

+0

即使是上面的最后一个示例,也可以删除所有这些括号,它会产生相同的结果。 –

回答

5

它可能会消除它们,因为它不需要它们。

你有效地说:“不是这个” “不是这个” “不是这个” “不是这个。”

现在,如果你有一个“OR”在中间,它不得不顾及这些:

(ps.Package.Policy.Name != "Short-Term Career Policy" 
    && ps.Package.Name != "Early Talent Package") 
|| 
(ps.Package.Policy.Name != "Assignment Policy" 
    && ps.Package.Name != "Efficient Package") 
+0

当我把'和'换成'或'时,它的行为与我根本没有包含'where'语句的行为没有什么不同。' – user1477388

0

这是对我工作。

var ls = from ps in ctx.Package_Services 
     where 
      !(
       (ps.Package.Policy.Name == "Short-Term Career Policy" 
        && ps.Package.Name == "Early Talent Package") 
       || 
       (ps.Package.Policy.Name == "Assignment Policy" 
        && ps.Package.Name == "Efficient Package") 
      ) 
     select new 
     { 
      Service = ps.Service, 
      PackageService = ps 
     }; 

它生成的SQL是像这样:

SELECT 
1 AS [C1], 
[Extent4].[Id] AS [Id], 
[Extent4].[Name] AS [Name], 
[Filter1].[Id1] AS [Id1], 
[Filter1].[PackageId] AS [PackageId], 
[Filter1].[ServiceId] AS [ServiceId], 
[Filter1].[SectionId] AS [SectionId], 
[Filter1].[Mandatory] AS [Mandatory] 
FROM (SELECT [Extent1].[Id] AS [Id1], [Extent1].[PackageId] AS [PackageId], [Extent1].[ServiceId] AS [ServiceId], [Extent1].[SectionId] AS [SectionId], [Extent1].[Mandatory] AS [Mandatory] 
    FROM [dbo].[Package_Services] AS [Extent1] 
    INNER JOIN [dbo].[Packages] AS [Extent2] ON [Extent1].[PackageId] = [Extent2].[Id] 
    INNER JOIN [dbo].[Policy] AS [Extent3] ON [Extent2].[PolicyId] = [Extent3].[Id] 
    WHERE (NOT (((N'Short-Term Career Policy' = [Extent3].[Name]) AND (N'Early Talent Package' = [Extent2].[Name])) OR ((N'Assignment Policy' = [Extent3].[Name]) AND (N'Efficient Package' = [Extent2].[Name])))) AND (N'Exception Policy' <> [Extent3].[Name])) AS [Filter1] 
INNER JOIN [dbo].[Services] AS [Extent4] ON [Filter1].[ServiceId] = [Extent4].[Id] 
WHERE N'Transportation' = [Extent4].[Name] 
+0

但这在逻辑上与问题不同。 &!B)&(!C&!D)'不会通过'!((A&B)|(C&D))' – Jodrell

+0

看到什么样的SQL也会产生,如果你很在意它包括它 –

+1

@Jodrell:差异的根源在于原始的海报,它的鳕鱼e与他们的描述不符。 –

2

根据你说的话你要实现:

我不想组合X,我也不想组合Y;然而,我确实需要“早期人才套餐”,他们没有被绑定到 “短期就业政策”。而且,我也想“高效包”时 他们不依赖于“分配策略。

我觉得你的布尔逻辑仅仅是有缺陷的总称。

你想早期的人才套餐当不依赖于短期就业政策

((ps.Package.Policy.Name == "Early Talent Package") 
&& (ps.Package.Policy.Name != "Short-Term Career Policy")) 

OR(||

你想效封装时不依赖于分配策略

((ps.Package.Name == "Efficient Package") 
&& (ps.Package.Policy.Name != "Assignment Policy")) 

一起:

((ps.Package.Policy.Name == "Early Talent Package") 
    && (ps.Package.Policy.Name != "Short-Term Career Policy")) 
|| 
((ps.Package.Name == "Efficient Package") 
    && (ps.Package.Policy.Name != "Assignment Policy")) 
+0

感谢您的回答;然而,它似乎并没有工作。它只返回8条记录。我的答案在下面是对我有用的。 – user1477388

+0

如果没有看到您的数据和/或结果,很难说是否因为它没有返回您期望的数据,或者您期望的结果与您实际布置的结果不同。我没有看到我的例子是如何过滤掉太多,除非你也在查找'Package.Name'不是'Early Talent Package'或'Efficient Package'的记录。 – mclark1129

+0

@ user1477388我确实意识到我不是' t使用额外的分组圆括号,可能会在结果中引起问题,所以我添加了它们。 – mclark1129