我在看你的回答,你说的作品,你只是想知道如何做一个“单LINQ查询。”请记住,这些查询都纷纷推迟执行,所以下面两个查询是功能上等同:
var q =
from d in dates
select d.Field<DateTime>("date");
return
(from r in records
where !q.Contains(r.Field<DateTime>("date"))
select r).CopyToDataTable();
和:
return
(from r in records
where !dates
.Select(d => d.Field<DateTime>("date"))
.Contains(r.Field<DateTime>("date"))
select r).CopyToDataTable();
第二个版本是很多难读,但尽管如此,它是“一个查询”。
话虽如此,没有这些例子似乎真的符合你的问题的标题,这表明您试图删除重复的行。如果这确实是你正在尝试做的,这里是将做到这一点的方法:
static DataTable RemoveDuplicates(DataTable dt)
{
return
(from row in dt.Rows.OfType<DataRow>()
group row by row.Field<string>("date") into g
select g
.OrderBy(r => r.Field<int>("ID"))
.First()).CopyToDataTable();
}
如果你不关心这重复删除,那么你可以只取出OrderBy
线。您可以测试这个如下:
static void Main(string[] args)
{
using (DataTable original = CreateSampleTable())
using (DataTable filtered = RemoveDuplicates(original))
{
DumpTable(filtered);
}
Console.ReadKey();
}
static DataTable CreateSampleTable()
{
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Code", typeof(string));
dt.Columns.Add("Name", typeof(string));
dt.Rows.Add(1, "123", "Alice");
dt.Rows.Add(2, "456", "Bob");
dt.Rows.Add(3, "456", "Chris");
dt.Rows.Add(4, "789", "Dave");
dt.Rows.Add(5, "123", "Elen");
dt.Rows.Add(6, "123", "Frank");
return dt;
}
static void DumpTable(DataTable dt)
{
foreach (DataRow row in dt.Rows)
{
Console.WriteLine("{0},{1},{2}",
row.Field<int>("ID"),
row.Field<string>("Code"),
row.Field<string>("Name"));
}
}
(只是用“代码”代替“日期”,在RemoveDuplicates
方法对于本例)
希望这些回答你的问题之一。否则,我认为你需要更清楚你的要求。
我不确定我是否理解这些要求。您的意思是您需要查找数据库中给定表中不存在的所有日期值,或者您是否需要从表B中不存在日期值的数据库中的表A中删除行? – Thomas 2010-02-28 16:36:03
@Thomas:让我来描述一下情况。我需要使用SqlBulCopy将新数据添加到数据库。但首先我需要清理它 - 我没有添加数据库中已经存在的数据。标准 - 日期。例如,首先我添加了Jan,1,2,3的数据。之后 - 2,3,4。我需要从第二组中删除Jan,2。 – abatishchev 2010-03-01 06:47:21