如何解决Linq-如何在where子句中使用2列
我有两个数据表,我想使用linq基于2列(col1,col2)从第一张表中选择第二张表中不存在的行
请检查以下示例
我尝试过此页面中的示例 Compare two DataTables and select the rows that are not present in second table
在示例中,它们仅使用一列
编辑1 我尝试过
DataTable Table1 = new DataTable();
Table1.Columns.Add("col1",typeof(string));
Table1.Columns.Add("col2",typeof(string));
DataRow r1 = Table1.NewRow();
r1["col1"] = "A";
r1["col2"] = "A-1";
Table1.Rows.Add(r1);
DataRow r2 = Table1.NewRow();
r2["col1"] = "B";
r2["col2"] = "B-2";
Table1.Rows.Add(r2);
DataRow r3 = Table1.NewRow();
r3["col1"] = "C";
r3["col2"] = "C-3";
Table1.Rows.Add(r3);
DataRow r4 = Table1.NewRow();
r4["col1"] = "D";
r4["col2"] = "D-4";
Table1.Rows.Add(r4);
DataRow r5 = Table1.NewRow();
r5["col1"] = "E";
r5["col2"] = "E-5";
Table1.Rows.Add(r5);
DataTable Table2 = new DataTable();
Table2.Columns.Add("col1",typeof(string));
Table2.Columns.Add("col2",typeof(string));
DataRow r11 = Table2.NewRow();
r11["col1"] = "A";
r11["col2"] = "A-1";
Table2.Rows.Add(r11);
DataRow r22 = Table2.NewRow();
r22["col1"] = "B";
r22["col2"] = "B-2";
Table2.Rows.Add(r22);
DataRow r33 = Table2.NewRow();
r33["col1"] = "C";
r33["col2"] = "C-4";
Table2.Rows.Add(r33);
DataRow r44 = Table2.NewRow();
r44["col1"] = "D";
r44["col2"] = "DD";
Table2.Rows.Add(r44);
DataRow r55 = Table2.NewRow();
r55["col1"] = "E";
r55["col2"] = "EE";
Table2.Rows.Add(r55);
DataRow r66 = Table2.NewRow();
r66["col1"] = "F";
r66["col2"] = "FF";
Table2.Rows.Add(r66);
示例-1
DataTable table3s = (from a in Table1.AsEnumerable()
where !Table2.AsEnumerable().Any(e => (e.Field<string>("col1") == a.Field<string>("col1"))
&& (e.Field<string>("col2") == a.Field<string>("col2")))
select a).CopyToDataTable();
示例-2
DataTable TableC = Table1.AsEnumerable().Where(ra => !Table2.AsEnumerable()
.Any(rb => rb.Field<string>("col1") == ra.Field<string>("col1")
&& rb.Field<string>("col2") == ra.Field<string>("col2"))).CopyToDataTable();
示例1和2在没有匹配的行时给出错误
源不包含DataRows
请根据我的示例代码给出工作示例,并提出最有效的方法,因为DataTable可能包含10000行,20000行及更多的大记录
解决方法
或者使用Any:使用适当的外部联接而没有隐式循环的事物:
var res = from a in Table1
join b in Table2
on (a.col1,a.col2) equals (b.col1,b.col2)
into temp
from b in temp.DefaultIfEmpty(default)
where b.col2 == null
select a;
它只是使用组合键将两个表连接在一起,并将其放入temp表中。然后,它执行外部联接(DefaultIfEmpty
),并仅从Table1中获得联接返回空结果的那些条目。
假设您有
class Table1
{
public string col1 { get; set; }
public string col2 { get; set; }
}
class Table2
{
public string col1 { get; set; }
public string col2 { get; set; }
}
和
List<Table1> table1s = new List<Table1>();
List<Table2> table2s = new List<Table2>();
查询是
var table3s = from table1 in table1s
where !table2s.Any(e => (e.col1 == table1.col1) && (e.col2 == table1.col2))
select table1;
,
尝试一下。基本上,这行代码从Table1中选择了Table2中不存在“ col1”和“ col2”值的每个元素。
var results = Table1.AsEnumerable().Where(t1 => Table2.AsEnumerable().All(t2 => t2["col1"] !=
t1["col1"] || t2["col2"] != t1["col2"]));
,
我尝试使用以下逻辑解决此问题。请让我知道我是否在这里错过了什么?
$em = $this->getDoctrine()->getManager();
$platform = $em->getRepository("AGAAnalyticsBundle:Platform")->find(1);
$platform->addProduct('05062');
$em->flush();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。