2014-01-17 62 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