Я смотрю на ваш ответ, который, по вашему мнению, работает, и вы просто хотите узнать, как это сделать в «одном запросе 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"));
}
}
(просто замените «date» на «Code» в методе RemoveDuplicates
для этого примера)
Надеюсь, один из них ответит на ваш вопрос. В противном случае, я думаю, вам придется более четко разобраться с вашими требованиями.