Я смотрю на ваш ответ, который вы говорите, работает, и вы просто хотите знать, как сделать это в «одном запросе 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
для данного примера)
Надеюсь, в один из этих ответов на ваш вопрос. В противном случае, я думаю, вам нужно будет более четко понять ваши требования.
Я не уверен, что понимаю требования. Вы имеете в виду, что вам нужно найти все значения даты, которые не существуют в данной таблице в базе данных, или вы имеете в виду, что вам нужно удалить строки из таблицы A в базе данных, где значение даты не существует в таблице B? – Thomas
@ Томас: Позвольте мне описать ситуацию. Мне нужно добавить новые данные в базу данных, используя SqlBulCopy. Но сначала мне нужно его очистить - я не добавляю данные, уже существующие в базе данных. Критерии - дата. Например, сначала я добавил данные за январь, 1,2,3. А после этого - за 2,3,4. Мне нужно удалить Jan, 2 из второго набора. – abatishchev