2010-11-02 9 views
0

J'ai une table avec deux colonnes qui seront utilisées comme critères de filtrage. En utilisant Linq to Entities, je veux passer deux valeurs et toujours retourner la correspondance la plus proche. Par exemple, (1,2) devrait renvoyer (1,2) non (null, 2) comme le plus proche. Si aucune valeur ne trouve de correspondance, la correspondance de colonne Null, Null est utilisée.Utilisation de Linq to Entities pour trouver la meilleure correspondance dans le tableau

Voici l'exemple de code.

Si 3,3 est passé dans le premier Data (null, null) doit être retourné car il n'y a pas de correspondance.

Si 1,3 est transmis, la deuxième donnée (1, null) doit être renvoyée.

Si 3,2 est transmis, la troisième donnée (null, 2) doit être renvoyée.

Si 1,2 est transmis, la quatrième donnée (1,2) doit être retournée. Est-ce possible dans une requête Linq, car elle génère un hit de base de données?

public class Data 
     { 
      public string prop1 { get; set; } 
      public string prop2 { get; set; } 
     } 

     static void Main(string[] args) 
     { 
      List<Data> datas = new List<Data> 
            { 
             new Data 
              { 
               prop1 = null, 
               prop2 = null 
              }, 
             new Data 
              { 
               prop1 = "1", 
               prop2 = null 
              }, 
             new Data 
              { 
               prop1 = null, 
               prop2 = "2" 
              }, 
             new Data 
              { 
               prop1 = "1", 
               prop2 = "2" 
              } 
            }; 


     } 

Répondre

1

pourrait simplement faire quelque chose comme

Data def = new Data { prop1 = null, prop2 = null }; 
    var result = (from d in datas 
        where d.prop1 == value1 || d.prop2 == value2 
        orderby (d.prop1 == value1 ? 8 : 0) + (d.prop2 == value2 ? 4 : 0) + (d.prop1 == null ? 2: 0) + (d.prop2 == null ? 1 : 0) descending 
        select d).FirstOrDefault() ?? def; 

où valeur1 et valeur2 sont la chaîne 2 à rechercher, devrait fonctionner comme une requête (n'a pas testé)

+1

Cela ne couvre pas le cas où il n'y a pas de correspondance pour prop1 ou prop2 et je veux retourner l'entrée null, null. – Kenoyer130

+0

Hrm, juste l'ajouter en tant que vérification nulle supplémentaire? a changé l'exemple à montrer, si vous voulez qu'il obtienne la première valeur de l'ensemble, supprimez simplement la ligne where complète à la place. – Doggett

+0

Cela ne fonctionne pas non plus si l'ordre des données est modifié dans la liste:/Par exemple, la commutation des entrées 3 et 4 entraînera le renvoi (3,2) (1,2). – Kenoyer130