2010-11-15 4 views
1

J'ai utilisé la bibliothèque System.Linq.Dynamic. Existe-t-il un moyen d'utiliser les entités avec une relation de un à plusieurs. Pour être précis je 3 classesDynamic.Linq Building générique Où Condition

class A 
{ 
    public int Id {get;set;} 
    ... 
    ... 

    public Class2 class2 {get;set;} 

    public ICollection<Another> Bs{get;set;} 

} 
class Class2 
{ 
    public int Id{get;set;} 
} 
class Another 
{ 
    public int Id {get;set;} 
} 

Je peux filtrer lorsque la relation est une à une

public IQueryable<T> Select<T>(string condition,object value) 
{ 
var list=FindAll<T>();//return list of T from database 
var result=list.Where(string.Format("{0} = @0",condition),value); 
} 

result=Select<A>("class2.Id",1); 

l'appel ci-dessus me donne la liste des A objets dont l'id class2 = 1. comment puis-je rechercher si la relation est un à plusieurs .. comment puis-je filtrer la liste des objets A en fonction du premier élément de Bs de chaque objet, par exemple Bs [0]. serait-il possible de filtrer en utilisant Linq.Dynamic.

Répondre

1

Il n'est pas possible de filtrer directement sur le premier élément d'une relation de collection (tel que Bs[0]), par exemple, car ICollection<B> n'a pas d'indexeur.

Cependant, il est possible d'utiliser des prédicats tels que Any dans une expression dynamique Linq, tels que:

result = list.Where("Bs.Any(Id = @0)", value); 

qui équivaut à

result = from a in list 
     where a.Bs.Any(b => b.Id == value) 
     select a; 

(Cela se traduit par une requête EXISTS dans SQL.)

Je pense que c'est ce que vous cherchez, pas Bs[0].


La liste complète des prédicats pris en charge et des agrégats pour System.Linq.Dynamique semble être:

  • (état)
  • Tout() et Tout (état)
  • Tous (état)
  • Compter() et comte (état)
  • Max (sélecteur)
  • min (sélecteur)
  • Somme (sélecteur)
  • moyenne (se lector)

Pour Bs[0].Id = @0, vous aurez besoin d'avoir un soutien pour First (état), que vous pouvez ajouter à une copie privée de System.Linq.Dynamic, en éditant l'interface IEnumerableSignatures, ajoutant

void First(); 
void First(bool predicate); 
void FirstOrDefault(); 
void FirstOrDefault(bool predicate); 

(Dernière Ajout d'(OrDefault) et Single (OrDefault) et serait à mon humble avis logique.)