使用not exist和join的SQL查询转换为LINQ语法

10

我的 MySQL 查询如下,可以在 SQL 中正常运行。我需要将其转换为 LINQ 语法。

SQL-

SELECT [Key], Id
FROM LocalizationKeys AS lk
WHERE NOT EXISTS (SELECT 1
                  FROM Languages AS l
                  JOIN LocalizationValues AS lv ON l.Id = lv.LanguageId
                  WHERE l.Title = 'en-US' AND lv.LocalizationKeyId = lk.Id)

我尝试过的LINQ语法

var result = 

(from lk in localizationKey    
where !(from l in lang
        join lv in localizationValue on l.Id equals lv.LanguageId
        where l.Title == "en-US" && lv.LocalizationKeyId == lk.Id select 1).FirstOrDefault()   

 select lk).ToList();

出现错误:

运算符“!”不能应用于类型为“int”的操作数

我犯了哪个错误?

3个回答

2
你可以尝试这样做:
(from lk in localizationKey    
where (from l in lang
        join lv in localizationValue on l.Id equals lv.LanguageId
        where (l.Title == "en-US" && lv.LocalizationKeyId == lk.Id)   
       select l).FirstOrDefault() == null
 select lk).ToList();

或者

(from lk in localizationKey    
where !(from l in lang
        join lv in localizationValue on l.Id equals lv.LanguageId
        where !(l.Title == "en-US" && lv.LocalizationKeyId == lk.Id) 
        select l).FirstOrDefault().Any()
 select lk).ToList();

在第一个示例中,逻辑应该相反,即 FirstOrDefault() == null - Alex Art.
获取 - 查询语句主体必须以select子句或group子句结尾。 - Neo
是的,我的错,我已经修复了,谢谢@AlexArt。 - Alper Tunga Arslan
谢谢,它在linqPAD上运行良好,但在我的C#应用程序中,它正在获取所有记录:(为什么? - Neo
.FirstOrDefault().Any() - 在使用Any()之前不需要先使用FirstOrDefault(),直接使用.Any()即可。 - Alex Art.
显示剩余2条评论

2

我认为你的原始查询是正确的,你只需要在where子句中添加另一对括号:

(from lk in localizationKey     
  where !((from l in lang
        join lv in localizationValue on l.Id equals lv.LanguageId
        where l.Title == "en-US" && lv.LocalizationKeyId == lk.Id select 1).Any())
 select lk).ToList();

我认为问题在于我将表格值放入var变量中,所以可能是错误的?有什么线索吗?我正在获得所有localizationKey值作为输出 - Neo
那么最有可能的问题是你的SQL查询。我假设它返回相同的结果。 - Alex Art.

1

试试这个:

(from lk in localizationKey    
where (from l in lang
        join lv in localizationValue on l.Id equals lv.LanguageId
        where !(l.Title == "en-US" && lv.LocalizationKeyId == lk.Id) select 1).FirstOrDefault()   

 select lk).ToList();

无法将类型“int”隐式转换为类型“bool” - Neo
我认为问题在于我将表格值放在了变量中,这可能是错误的原因?有什么线索吗?我得到了所有localizationKey值作为输出。 - Neo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接