Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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# 如何获取第一个数据表中存在的数据,以及第三个数据表中第二个数据表中不存在的数据?_C#_Asp.net_Sql_Linq - Fatal编程技术网

C# 如何获取第一个数据表中存在的数据,以及第三个数据表中第二个数据表中不存在的数据?

C# 如何获取第一个数据表中存在的数据,以及第三个数据表中第二个数据表中不存在的数据?,c#,asp.net,sql,linq,C#,Asp.net,Sql,Linq,问: 我有两个查询,每个查询返回一个DataTable。我想返回另一个DaTaTable,作为(第一个DaTaTable中存在而第二个DaTaTable中不存在(不存在)的结果 我的问题是: 编辑:我将其设置为一般性: 1-DT1: DataTable dt1 = cc1assiscrsevalDAL.GetAll(int.Parse(Session["course_prof"].ToString()), 0); 2-DT2: DataTable dt2 = cc1assiscrsevalDA

问:

我有两个查询,每个查询返回一个
DataTable
。我想返回另一个
DaTaTable
,作为(第一个DaTaTable中存在而第二个DaTaTable中不存在(不存在)的结果

我的问题是:

编辑:我将其设置为一般性:

1-DT1:

DataTable dt1 = cc1assiscrsevalDAL.GetAll(int.Parse(Session["course_prof"].ToString()), 0);
2-DT2:

DataTable dt2 = cc1assiscrsevalDAL.GetConfirmedEval(int.Parse(Session["course_prof"].ToString()));
注意:批次号、crsnum、选择码是复合主键


最好的方法是什么?(明智的表现)。 我也想和LINQ一起做(如果可能的话)

相当脏的解决方案,但我认为您可以简化它,只获得所需的批处理代码、crsnum和SELECT代码,而无需执行两次第一次查询。但你得自己想办法

var dt = dt1.AsEnumerable().Except(dt2.AsEnumerable(), new CustomDataRowEqualityComparer()).CopyToDataTable();

    public class CustomDataRowEqualityComparer: IEqualityComparer<DataRow>
        {

            public bool Equals(DataRow x, DataRow y)
            {
                return ((int)x["crsnum"]) == ((int)y["crsnum"])
                    && ((int)x["crsnum_e"]) == ((int)y["crsnum_e"])
                        && ((int)x["crstteng"]) == ((int)y["crstteng"]);
            }

            public int GetHashCode(DataRow obj)
            {
                return ((int)obj["crsnum"]) ^ ((int)obj["crsnum_e"]) ^ ((int)obj["crstteng"]) ;
            }
        }
相当脏的解决方案,但我认为您可以简化它,只获得所需的批处理代码、crsnum和SELECT代码,而无需执行两次第一次查询。但是你必须自己解决它。

var dt=dt1.aseneumerable()。除了(dt2.aseneumerable(),new CustomDataRowEqualityComparer())。CopyToDataTable();
var dt = dt1.AsEnumerable().Except(dt2.AsEnumerable(), new CustomDataRowEqualityComparer()).CopyToDataTable();

    public class CustomDataRowEqualityComparer: IEqualityComparer<DataRow>
        {

            public bool Equals(DataRow x, DataRow y)
            {
                return ((int)x["crsnum"]) == ((int)y["crsnum"])
                    && ((int)x["crsnum_e"]) == ((int)y["crsnum_e"])
                        && ((int)x["crstteng"]) == ((int)y["crstteng"]);
            }

            public int GetHashCode(DataRow obj)
            {
                return ((int)obj["crsnum"]) ^ ((int)obj["crsnum_e"]) ^ ((int)obj["crstteng"]) ;
            }
        }
公共类CustomDataRowEqualityComparer:IEqualityComparer { 公共布尔等于(数据行x、数据行y) { 返回((int)x[“crsnum”])==((int)y[“crsnum”]) &&((int)x[“crsnum_e”])==((int)y[“crsnum_e”]) &&((int)x[“crstteng”])==((int)y[“crstteng”]); } public int GetHashCode(DataRow obj) { 返回((int)obj[“crsnum”])^((int)obj[“crsnum_e”])^((int)obj[“crstteng”]); } }
linq中有一个扩展方法,名为Except,它解决了您的问题,但是我们需要为我在上面代码中所做的创建一个单独的类

var dt=dt1.aseneumerable()。除了(dt2.aseneumerable(),new CustomDataRowEqualityComparer()).CopyToDataTable();
公共类CustomDataRowEqualityComparer:IEqualityComparer
{
公共布尔等于(数据行x、数据行y)
{
返回((int)x[“crsnum”])==((int)y[“crsnum”])
&&((int)x[“crsnum_e”])==((int)y[“crsnum_e”])
&&((int)x[“crstteng”])==((int)y[“crstteng”]);
}
public int GetHashCode(DataRow obj)
{
返回((int)obj[“crsnum”])^((int)obj[“crsnum_e”])^((int)obj[“crstteng”]);
}
}

linq中有一个扩展方法,名为Except,它解决了您的问题,但是我们需要为我在上面代码中所做的创建一个单独的类

Linq为您提供了一个Except方法,因此您可以执行类似的操作

var _differences = dt1.AsEnumerable.Except(dt2.AsEnumerable()); // No checked or tested in VS
您还可以先使用以下内容获取相关列:

var x = From a In dt1
    Select (...relevant columns)

var y = From a In dt2
    Select (...relevant columns)
然后做上面的事情,除了


Linq为您提供了一个Except方法,因此您可以执行类似的操作

var _differences = dt1.AsEnumerable.Except(dt2.AsEnumerable()); // No checked or tested in VS
您还可以先使用以下内容获取相关列:

var x = From a In dt1
    Select (...relevant columns)

var y = From a In dt2
    Select (...relevant columns)
然后做上面的事情,除了


无论何时使用NOT EXISTS,您都会根据表的大小设置自己的性能,因为NOT EXISTS将进行完整的表扫描。@Tim:您能以任何方式证明这一点吗?这表示NOT EXISTS是优化的,因为它是一个半连接,或者在这里它是针对MySQL、SQL Server、Oracle进行探索的:@gbn-我基于我过去与许多DBA合作过的内容告诉我的。显然,这并不完全正确(就像许多其他笼统的说法一样)。然而,我仍然认为,最好尽可能避免不存在。@just_name:什么表存在和不存在?@Tim:你想什么就想什么:但不要在公共论坛上发布这样的垃圾信息……无论何时使用不存在,你都在为自己的性能设置,这取决于表的大小,因为“不存在”将进行完整的表格扫描。@Tim:你能用任何方式证明吗?这表示NOT EXISTS是优化的,因为它是一个半连接,或者在这里它是针对MySQL、SQL Server、Oracle进行探索的:@gbn-我基于我过去与许多DBA合作过的内容告诉我的。显然,这并不完全正确(就像许多其他笼统的说法一样)。然而,我仍然认为,最好尽可能避免“不存在”。@just_name:什么表存在和不存在?@Tim:你想什么就想什么:但不要在公共论坛上发布这样的垃圾……结构仍然不同。您希望包括/排除哪些键?我不知道你的数据库结构:)还是不同的结构。您希望包括/排除哪些键?我不知道您的数据库结构:),这将导致两个查询中的所有记录,但just_name不需要包括第二个查询中的记录。这将导致两个查询中的所有记录,但just_name不需要包括第二个查询中的记录。