在 LinQ 连接查询中使用 'OR'(将 SQL 适配到 LinQ)
Using 'OR' inside a LinQ join query (adapting SQL into LinQ)
我有一个 SQL 查询,它基本上在两个键上将 MyWords table 连接到 MyTranslations table。这是我的 table 以便更好地理解。
MyWords table:
Id
WordString
LangType
我的翻译 table:
Id
WordColumnAId
WordColumnBId
请注意 WordColumnAId
和 WordColumnBId
列是代表 MyWords.Id
的外键。
我的 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
与多个键一起使用是没有意义的,但我正在尝试一个交叉查询,该查询将连接两个 table 是否键是在 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 中实现这一点,还是我正在尝试不可能的事情?我也愿意接受更好的方法。
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,
};
我有一个 SQL 查询,它基本上在两个键上将 MyWords table 连接到 MyTranslations table。这是我的 table 以便更好地理解。
MyWords table:
Id
WordString
LangType
我的翻译 table:
Id
WordColumnAId
WordColumnBId
请注意 WordColumnAId
和 WordColumnBId
列是代表 MyWords.Id
的外键。
我的 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
与多个键一起使用是没有意义的,但我正在尝试一个交叉查询,该查询将连接两个 table 是否键是在 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 中实现这一点,还是我正在尝试不可能的事情?我也愿意接受更好的方法。
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,
};