Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 左join-LINQ有问题吗_C#_Linq_Datatable_Left Join - Fatal编程技术网

C# 左join-LINQ有问题吗

C# 左join-LINQ有问题吗,c#,linq,datatable,left-join,C#,Linq,Datatable,Left Join,我有两个数据表t1和t2。我正在尝试执行LINQ左连接,多个等连接,以获取t1中不在t2中的数据行 在SQL中,我试图实现的是: select t1.* from t1 left join t2 on t1.a=t2.a and t1.b=t2.b and t1.c=t2.c where t2.a is null 到目前为止,我有以下几点: public DataTable t1_without_t2(DataTable t1, DataTable t2)

我有两个数据表
t1
t2
。我正在尝试执行LINQ左连接,多个等连接,以获取
t1
中不在
t2
中的数据行

在SQL中,我试图实现的是:

select t1.* 
from t1
left join t2
on t1.a=t2.a and
   t1.b=t2.b and
   t1.c=t2.c
where
   t2.a is null
到目前为止,我有以下几点:

public DataTable t1_without_t2(DataTable t1, DataTable t2)
        {
            var query = from t1_row in t1.AsEnumerable()
                        join t2_row in t2.AsEnumerable()
                        on 
                        new { t_a = t1_row["a"], t_b = t1_row["b"], t_c = t1_row["c"]}   
                        equals
                        new { t_a = t2_row["a"], t_b = t2_row["b"], t_c = t2_row["c"]}
                        into leftJoinT1withoutT2
                        from join_row in leftJoinT1withoutT2.DefaultIfEmpty()
                        where t2_row["a"] == null
                        select new
                        {
                            j_a = join_row["a"],
                            j_b = join_row["b"],
                            j_c = join_row["c"],
                        };
            DataTable dt = t1.Clone();
            foreach (var result in query)
            {
                dt.LoadDataRow(
                    new object[]
                    {
                        result.j_a,
                        result.j_b,
                        result.j_c
                    },
                    false);
            }
            return dt;
        }
这在
j_a=join_row[“a”]
行失败,并显示以下消息:
列“a”不属于表。


我认为
into leftjoint1 without t2
行应该将联接的结果放入一个列结构为table
t1
的var中,使用
从中删除不匹配的条目,其中t2\u row[“a”]==null
。这不是这里发生的事吗?我有点困惑。

应该是这样的:

var query = from t1_row in t1.AsEnumerable()
            join t2_row in t2.AsEnumerable()
            on
            new { t_a = t1_row["a"], t_b = t1_row["b"], t_c = t1_row["c"] }
            equals
            new { t_a = t2_row["a"], t_b = t2_row["b"], t_c = t2_row["c"] }
            into leftJoinT1withoutT2
            from join_row in leftJoinT1withoutT2.DefaultIfEmpty()
                                                .Where(r => r == null)
            select new
            {
                j_a = t1_row["a"],
                j_b = t1_row["b"],
                j_c = t1_row["c"],
            };
看一看


t2
中没有匹配元素时,
t1\u行
始终包含联接值,则
join行
将获取
null
(即默认
TSource
值,请参阅)。因此,只要您只需要那些
join\u row
null
的行,我就使用了
。其中(r=>r==null)

您的查询不需要compile@KonstantinVasilcov,是的,
其中t2_行[“a”]==null
行。很抱歉,我在调试此代码时已将该行注释掉。我不知道为什么它没有编译,在这个查询级别上,
t2\u行
不应该是可见的吗?