Je regarde votre réponse, vous dites œuvres, et que vous voulez juste savoir comment le faire dans une « seule requête LINQ. » Gardez à l'esprit que ces requêtes ont tous reporté l'exécution, de sorte que les deux requêtes suivantes sont fonctionnellement équivalentes:
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();
Et:
return
(from r in records
where !dates
.Select(d => d.Field<DateTime>("date"))
.Contains(r.Field<DateTime>("date"))
select r).CopyToDataTable();
La deuxième version est beaucoup plus difficile à lire, mais néanmoins, il est "une requête".
Cela dit, aucun de ces exemples semblent vraiment correspondre à votre titre de la question, ce qui laisse supposer que vous essayez de supprimer des lignes en double . Si tel est bien ce que vous essayez de faire, voici une méthode qui le fera:
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();
}
Si vous ne se soucient pas de qui doublons supprimés alors vous pouvez simplement supprimer la ligne OrderBy
. Vous pouvez tester cela comme suit:
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"));
}
}
(il suffit de remplacer « date » avec « Code » dans la méthode RemoveDuplicates
pour cet exemple)
Espérons que l'un de ces réponses à votre question. Sinon, je pense que vous allez devoir être plus clair avec vos exigences.
Je ne suis pas sûr de comprendre les exigences. Voulez-vous dire que vous devez trouver toutes les valeurs de date qui n'existent pas dans une table donnée dans la base de données ou voulez-vous dire que vous devez supprimer des lignes du tableau A dans la base de données où la valeur n'existe pas dans le tableau B? – Thomas
@ Thomas: Laissez-moi décrire la situation. J'ai besoin d'ajouter de nouvelles données à la base de données en utilisant SqlBulCopy. Mais d'abord je dois le nettoyer - je n'ai pas ajouté de données déjà existantes dans la base de données. Critères - date. Par exemple, j'ai d'abord ajouté des données pour Jan, 1,2,3. Et après cela - pour 2,3,4. Je dois retirer Jan, 2 du second set. – abatishchev