[英]Linq query with multiple OR conditions in multiple joins
我已经经历了很多答案,但没有找到任何可以帮助我解决这个问题的答案。 我知道“OR”部分应该出现在 Where 子句中,而不是连接本身,但不幸的是,这看起来不太可能用于我的查询。
有了这两个表,大大简化了这个问题:
Claim: FKeyID int, CKeyID int, ICode varchar(100), IName varchar(100)
Lookup: LFKeyID int, LCKeyID int, LICode varchar(100), LIName varchar(100)
我需要在 linq 方法语法中执行以下操作:
select * from Claim c
left join Lookup l on
(l.LFKeyID = c.FKeyID OR l.LFKeyID = 0)
AND (l.LCKeyID = c.CKeyID OR l.LCKeyID = 0)
AND (l.LICode = c.ICode OR l.LIName = c.IName)
我已经尝试了以下方法,但它只是加入初始键并且没有查找键 = 0 的 OR 子句。我完全被难住了。
query = _context.Claim.Join(_context.Lookup,
clm => clm.FKeyID, lk => lk.LFKeyID, (clm, lk) => new
{ ... fields go here ... })
.DefaultIfEmpty().ToList();
如果其他人试图使用方法语法来完成此操作,这里是解决方案,这要归功于给出的评论:
var query = _context.Claim.Where(i => (various initial filter criteria))
.SelectMany(clm => _context.Lookup, (clm, lk) = new { clm, lk })
.Where(lk => (lk.LFKeyID == clm.FKeyID || lk.LFKeyID == 0)
&& (lk.LCKeyID == clm.CKeyID || lk.LCKeyID == 0)
&& (lk.LICode == clm.ICode || lk.LIName == clm.IName))
.DefaultIfEmpty()
.Select(s => new
{
// list of fields
}).ToList();
您可以使用复杂查询运算符中描述的其他技术进行 LEFT JOIN
var query =
from clm in _context.Claim
from lk in _context.Lookup
.Where(lk => (lk.LFKeyID == clm.FKeyID || lk.LFKeyID == 0)
&& (lk.LCKeyID == clm.CKeyID || lk.LCKeyID == 0)
&& (lk.LICode == clm.ICode || lk.LIName == clm.IName))
.DefaultIfEmpty()
select new
{
clm, // or specify fields precisely
lk
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.