首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ未读括号

LINQ未读括号
EN

Stack Overflow用户
提问于 2014-01-18 00:26:27
回答 3查看 226关注 0票数 0

这是我的LINQ (EF):

代码语言:javascript
复制
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:

代码语言:javascript
复制
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呢?

EN

回答 3

Stack Overflow用户

发布于 2014-01-18 00:29:11

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

你实际上是在说“不是这个”和“不是这个”。

现在,如果中间有一个"OR“,它必须将它们考虑在内:

代码语言:javascript
复制
(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")
票数 5
EN

Stack Overflow用户

发布于 2014-01-18 00:50:00

基于你所说的你正在努力实现的目标:

我不想要组合X,我也不想要组合Y;然而,我确实想要“早期人才套餐”,他们不受“短期职业政策”的约束。而且,当它们不与“分配策略”捆绑在一起时,我也想要“高效包”。

我认为你的布尔逻辑在总体上是有缺陷的。

Early Talent Package未与短期职业政策捆绑时,您想要它

代码语言:javascript
复制
((ps.Package.Policy.Name == "Early Talent Package") 
 && (ps.Package.Policy.Name != "Short-Term Career Policy"))

或(||)

您希望在未绑定到分配策略时使用Efficient Package

代码语言:javascript
复制
((ps.Package.Name == "Efficient Package") 
 && (ps.Package.Policy.Name != "Assignment Policy"))

总而言之:

代码语言:javascript
复制
((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"))
票数 2
EN

Stack Overflow用户

发布于 2014-01-18 00:49:04

这就是对我有效的方法。

代码语言:javascript
复制
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如下所示:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21190846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档