【问题标题】:Using 'OR' inside a LinQ join query (adapting SQL into LinQ)在 LinQ 连接查询中使用“或”(将 SQL 适配到 LinQ)
【发布时间】:2021-05-07 17:12:09
【问题描述】:

我有一个 SQL 查询,它基本上通过两个键将 MyWords 表连接到 MyTranslations 表。这是我的表格以便更好地理解。

MyWords 表:

Id
WordString
LangType

MyTranslations 表:

Id
WordColumnAId
WordColumnBId

请注意,WordColumnAIdWordColumnBId 列是代表 MyWords.Id 的 FK。 我的 SQL 查询:

SELECT MyTranslations.Id 
    ,WordColumnAId
    ,WordColumnBId
    ,MyWords.WordString
    ,MyWords.LangType
  FROM MyTranslations
  join MyWords on (MyTranslations.WordColumnAId = MyWords.Id or MyTranslations.WordColumnBId = MyWords.Id)
  where MyWords.LangType !=@currentLangType

我知道乍一看将join on 与多个键一起使用是没有意义的,但我正在尝试一个交叉查询来连接两个表,无论键是在WordColumnAId 还是WordColumnBId

问题

我正在尝试将上述 T-SQL 查询调整为 LinQ 查询。问题是我无法在 LinQ 中找到在单个连接查询中使用两个键的方法。

这是我目前得到的:

from translation in queryableTranslation
    join word in _myWordRepository on translation.WordColumnAId equals word.Id // This is where I want to add `or translation.WordColumnBId equals word.Id` but get errors.
    where word.LangType != currentLangType
    select new QueryResultDto {
        MyTranslationId = translation.Id,
        WordString = word.WordString,
        LanguageType = word.LangType,
        WordColumnAId = translation.WordColumnAId,
        WordColumnbId=translation.WordColumnbId,
    };

我对 LinQ 很陌生,正在努力学习。 所以我的问题是:有没有办法在 LinQ 中实现这一点,还是我在尝试不可能的事情?我也愿意接受更好的方法。

【问题讨论】:

  • 这能回答你的问题吗? Linq - left join on multiple (OR) conditions
  • 谢谢,链接上的答案建议我应该使用where 而不是join,但不幸的是缺少两个wheres 的用法:一个用于过滤(消除),另一个为匹配。考虑到我对 LinQ 的了解非常有限,Svyatoslav 的回答更有帮助

标签: c# sql linq sql-to-linq-conversion


【解决方案1】:

使用此语法时,EF 和其他 LINQ 提供程序应将查询转换为 INNER JOIN:

var query =
    from translation in queryableTranslation
    from word in _myWordRepository.Where(word => translation.WordColumnAId == word.Id 
      || translation.WordColumnBId = word.Id)
    where word.LangType != currentLangType
    select new QueryResultDto 
    {
        MyTranslationId = translation.Id,
        WordString = word.WordString,
        LanguageType = word.LangType,
        WordColumnAId = translation.WordColumnAId,
        WordColumnbId=translation.WordColumnbId,
    };

【讨论】:

  • 是的!这解决了我的问题并允许我进行交叉查询。
猜你喜欢
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多