I'm looking at your answer, which you say works, and you just want to know how to do it in a "single LINQ query." Keep in mind that these queries all have deferred execution, so the following two queries are functionally equivalent:
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();
And:
return
(from r in records
where !dates
.Select(d => d.Field<DateTime>("date"))
.Contains(r.Field<DateTime>("date"))
select r).CopyToDataTable();
The second version is a lot harder to read, but nevertheless, it is "one query."
Having said this, none of these examples really seem to match your question title, which suggests that you are trying to remove duplicate rows. If that is indeed what you are trying to do, here is a method that will do that:
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();
}
If you don't care about which duplicates removed then you can just remove the OrderBy
line. You can test this as follows:
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"));
}
}
(just replace "date" with "Code" in the RemoveDuplicates
method for this example)
Hopefully one of these answers your question. Otherwise I think you're going to have to be more clear with your requirements.