2010-10-01 12 views
1

J'ai tenté d'écrire une méthode générique réutilisable pour les recherches sur un DataTable. Ce que j'ai jusqu'à présent:Écriture d'une méthode générique pour .Field <T>() dans Linq to DataSet

private static IEnumerable<DataRow> GetRow<FType>(string Tablename, 
    string Fieldname, FType Match) 
{ 
    var result = from row in dataSet.Tables[Tablename].AsEnumerable() 
       where row.Field<FType>(Fieldname) == Match 
       select row; 

    return result; 
} 

Cependant, nous n'aimons pas le row.Field<FType>(Fieldname) == Match.

Des idées sur ce que je suis supposé faire pour résoudre ce problème? Je reçois: L'opérateur '==' ne peut pas être appliqué à FType et FType.

Répondre

3

Remplacer == Match avec .Equals(Match) et vous devriez être bon. J'ai jeté une vérification nulle dans le cas où les valeurs pourraient être nulles.

private static IEnumerable<DataRow> GetRow<FType>(string Tablename, string Fieldname, FType Match) 
{ 
    var result = from row in dataSet.Tables[Tablename].AsEnumerable() 
       where row.Field<FType>(Fieldname) != null 
       && row.Field<FType>(Fieldname).Equals(Match) 
       select row; 

    return result; 
} 
+0

+1 pour inclure la vérification nulle. Bizarre comment '! =' Est correct mais ne peut pas utiliser '=='. – IAbstract

0

L'utilisation de .Equals() devrait faire l'affaire. Une autre option serait de passer dans un IComparer ou un délégué pour comparateur personnalisée comparer

+0

suggestions Nice, mais '.Equals' signifie que vous avez à répondre à la gauche sur les valeurs nulles du point, mais nous ne savons pas si' FType' est un type de référence ou de la valeur et si elle * Peut être nul ou pas. Vous pourriez contourner cela en fournissant deux méthodes distinctes avec des contraintes génériques différentes, mais cela me semble plutôt moche. –

+0

@Alex, les deux méthodes différentes devraient différer de plus que les contraintes, car elles ne font pas partie de la signature. Mais vous pouvez inclure une vérification nulle en toute sécurité dans la méthode unique. 'where row.Field (Nom du champ)! = null && [autres critères]' –

+0

@Anthony - ah, cool, je savais que j'aurais dû allumer mon IDE :) –

0

Vous pouvez utiliser la surcharge d'opérateur:

public static bool operator ==(FType a, FType b) 
{ 
    // Your code 
    // Check here if A and B are equal 
} 
1

j'utiliser un IEqualityComparer<T> pour le contrôle de l'égalité. Vous pourriez également ajouter une surcharge où le comparateur pourrait être spécifié explicitement.

private static IEnumerable<DataRow> GetRow<FType>(string Tablename, string Fieldname, FType match) 
{ 
    IEqualityComparer<FType> comp = EqualityComparer<TField>.Default; 
    return dataSet.Tables[Tablename] 
     .AsEnumerable() 
     .Where(comp.Equals(row.Field<FType>(Fieldname), match)); 
}