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不需要包括第二个查询中的记录。