3

我正在尝试映射一个必须过滤正确表的自连接,例如这样的 SQL:

select t2.* from table t 
    left join table t2 
    on t2.parentID = t.ID and t2.active=1;

如果我想过滤左表,我可以弄清楚语法:

// works
var query = from t in table
               where t.active= 1
            join t2 in table
               on t.parentID equals t2.ID into joined
            from r in joined.DefaultIfEmpty() ...

但我不知道如何过滤正确的表格。好像应该是这样的……

// does not work
var query = from t in table
            join t2 in table
               where t.field = 1
               on t.parentID equals t2.ID into joined
            from r in joined.DefaultIfEmpty() ...

(无效......join不能在哪里)。有关于使用多个 from 子句的讨论,但是如果我创建多个 from 子句,所以我可以将 a 添加where到第二个,我无法弄清楚如何将它们的结果加入到一个新的临时表中。

我不能只在加入后添加“位置”;必须首先过滤右表,否则将发生匹配,where最后的子句将从左表中删除我在输出中确实想要的行。也就是说,输出应该包含从过滤的右表中没有匹配的行。所以我需要在加入之前过滤正确的表。

4

1 回答 1

4

我认为你正在寻找这样做:

var query = from t in table
            join t2 in 
               (from t3 in table
                where t3.field = 1
                select t3)
               on t.parentID equals t2.ID into joined
            from r in joined.DefaultIfEmpty() ...

另一种方法是像这样使用多个from

var query = from t in table
            from t2 in table.Where(x => x.field = 1)
                            .Where(x => x.ID == t.parentID)
                            .DefaultIfEmpty()
            select ....
于 2013-01-15T20:04:22.860 回答