J'ai un code qui recherche dans une table de données des chaînes spécifiques et retourne un sous-ensemble de la datatable entière en fonction de certaines conditions (champ id unique). Exemple de code ci-dessous qui recherche "First" et "Employee" dans un datatable et ne renvoie que les entrées qui ont la même valeur l_id. Maintenant, si j'obtiens le texte de recherche de manière dynamique, comment puis-je procéder avec cela? Pour. Par exemple, dans le code ci-dessus si je devais passer "Premier" ainsi que "Employé" ainsi que "salaire" alors comment procéder?Construire dynamiquement la clause 'where' dans Linq
Comment puis-je rendre ce générique?
Merci d'avance pour votre aide!
EDIT - On dirait que je ne l'ai pas été clair dans mon post, alors laissez-moi reformuler à nouveau
J'ai un datatable qui ressemble à ce
l | t | r | b | x | y | w_text | l_id
-------------------------------------------------------------
70 | 314 | 141 | 328 | 1 | 5 | First | 4
149 | 318 | 194 | 328 | 2 | 5 | Employe| 4
204 | 311 | 254 | 326 | 3 | 5 | John | 4
264 | 311 | 325 | 326 | 4 | 5 | Smith | 4
1924 | 310 | 2000 | 329 | 5 | 5 | First | 5
70 | 341 | 109 | 355 | 1 | 6 | step | 5
115 | 340 | 130 | 355 | 2 | 6 | of | 5
136 | 340 | 175 | 355 | 3 | 6 | Linq | 5
185 | 339 | 320 | 356 | 4 | 6 | Last | 6
70 | 394 | 101 | 411 | 1 | 8 | Employe| 6
114 | 390 | 199 | 405 | 2 | 8 | John | 6
210 | 390 | 269 | 405 | 3 | 8 | Doe | 6
Les seuls critères de recherche que j'ai sur ma main est 'W_Text'.So je voudrais rechercher dire l'expression unique "Premier employé" .Seulement un l_id (dans ce cas l_id = 4) aurait à la fois les mots "First" ainsi que "Employee" .Si je recherche "Premier" séparément et "Employé" séparément, alors j'obtiendrais un ensemble de données plus grand qui ne résout pas mon but. Mon objectif est d'obtenir l'ensemble de données ci-dessous unique lorsque je recherche « premier employé »
l | t | r | b | x | y | w_text | l_id
-------------------------------------------------------------
70 | 314 | 141 | 328 | 1 | 5 | First | 4
149 | 318 | 194 | 328 | 2 | 5 | Employe| 4
204 | 311 | 254 | 326 | 3 | 5 | John | 4
264 | 311 | 325 | 326 | 4 | 5 | Smith | 4
En termes SQL, ce qui est similaire à
Select * From Table where l_id in (Select l_id from Table where W_Text in ('First','Employee') group by l_id having count(l_id) > 1)
Le code ci-dessus que je l'ai mentionné (a été aidé par un bon samaritain) fonctionne parfaitement bien et me renvoie l'ensemble de données ci-dessus. Le problème est que cela ne fonctionne qu'avec "First Employee". J'ai des problèmes avec la recherche dire "Première étape de Linq". la phrase de recherche est transmise au programme lors de l'exécution et peut être de combien de mots jamais. J'ai essayé de séparer les Wheres mais la condition 'ayant' manque et c'est là que le jeu de données entier est à nouveau retourné.
Par conséquent, je vous demande à tous de bien vouloir m'aider avec ce problème. Je suis très nouveau à Linq et j'essaie de faire mon chemin. En attendant, toute aide que je pourrais obtenir serait grandement appréciée. Merci.
--- EDIT a ce travail en utilisant ce code (avec l'aide de quelqu'un)
List<string> wTextFilter = new List<string>();
foreach (string sf in strInputString.Split(' ')) //array by splitting on white space
{
wTextFilter.Add(sf);
}
// Get all Id's that satisfy all conditions:
List<int> results = dtResult.AsEnumerable()
// Get all Id's:
.Select(dataRow => dataRow.Field<int>("l_id"))
// Filter the Id's :
.Where(id =>
// the Id should be greater than one.
id > 1 &&
// check if all W_Text entries has a record in the datatable with the same Id.
wTextFilter.All(W_Text => dtResult.AsEnumerable().Any(dataRow => dataRow.Field<string>("W_Text") == W_Text && dataRow.Field<int>("l_id") == id)))
.Distinct().ToList();
// Get all datatable rows filtered by the list of Id's.
dtCopy = dtResult.AsEnumerable().Where(dataRow => results.Contains((dataRow.Field<int>("l_id")))).CopyToDataTable();
utilisez votre propre homme logique! –
Pas tout à fait sûr de ce dont vous avez besoin, mais vous pouvez enchaîner les appels Where, comme '.Where (condition1) .Where (condition2)' et ainsi de suite. – vesan
Merci mon pote, pour le conseil. Je suis incapable de le craquer, d'où un avis d'expert! – DevNovice