繁体   English   中英

Linq 在多个连接中使用多个 OR 条件进行查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM