我在看你的回答,你說的作品,你只是想知道如何做一個「單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