【问题标题】:SQL Query to LINQ syntax using not exist and join使用不存在和连接的 SQL 查询到 LINQ 语法
【发布时间】:2016-03-31 07:26:47
【问题描述】:

我的 SQL 查询如下所示在 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”类型的操作数

有什么线索我在哪里犯错了吗?

【问题讨论】:

    标签: c# sql-server linq


    【解决方案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 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
    • getting - 查询正文必须以 select 子句或 group 子句结尾
    • 是的,我的错我把它修好了,@AlexArt。
    • 感谢在 linqPAD 上正常工作,但在我的 c# 应用程序中它正在获取所有记录:(为什么?
    • .FirstOrDefault().Any() - 你不需要在Any()之前做.FirstOrDefault(),它只需要.Any()
    【解决方案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 1).FirstOrDefault()   
    
     select lk).ToList();
    

    【讨论】:

    • 无法将类型“int”隐式转换为“bool”
    • 我认为问题是我在 var 变量中获取表值,那为什么可能是错误的?有什么线索吗?我将所有的本地化键值作为输出
    【解决方案3】:

    我认为您的原始查询很好,您只需要在 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 变量中获取表值,那为什么可能是错误的?有什么线索吗?我将所有的本地化键值作为输出
    • 那么很可能问题出在您的 sql 查询上。我假设它返回相同的结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 2021-05-07
    • 1970-01-01
    • 2021-08-25
    • 2014-06-23
    • 1970-01-01
    相关资源
    最近更新 更多