2014-05-19 5 views
1

Utilisation du contexte EntityFramework J'ai besoin de faire une recherche avec de nombreux champs.Entity Framework avec Dynamic Linq

Le EntityDBContext comprend

public class Brand 
{ 
    public int BrandID { get; set; } 
    public string BrandName { get; set; } 
    public string BrandDesc { get; set; } 
    public string BrandUrl { get; set; } 

    public virtual ICollection<Product> Products { get; set; } 
} 

public class Product 
{ 
    public string Name {get;set;} 
      public DateTime CreatedDate {get;set;}  
      public DateTime ExpiryDate {get;set;} 
    //The product class also contains many fields.(not shown here) 
} 

var context = new EntityDBContext();

Je voudrais chercher la marque avec l'aide du champ dans le produit. Les champs du produit ne sont connus qu'au moment de l'exécution. Comment puis-je créer l'expression pour rechercher la marque à l'aide des champs de produit. S'il vous plaît voir la capture d'écran. Merci, Binod

User search form

+0

Que voulez-vous dire que vos champs de produits ne sont connus que pendant l'exécution? Vous laissez un peu d'informations significatives du code que vous avez donné. Comment les champs sont-ils mappés dans votre modèle? –

+0

Exactement ce que vous voulez atteindre et s'il vous plaît montrer les champs qui relient ces deux classes. –

+0

Si je ne me trompe pas, alors vous voulez obtenir les marques sur la base du produit, non? Faites le moi savoir pour que je puisse partager le code .. –

Répondre

0

Tout d'abord, je suis un peu clair sur cette partie de votre question:

the fields of the product are only known at run time.
Comment? Pouvez-vous élaborer là-dessus, parce que je ne vois pas une implémentation fonctionnelle de cela en utilisant EF. Quelle est la configuration de votre table de base de données (Products)? Quelles propriétés sont dans cette classe?

Nous devons savoir cela avant que nous puissions vous donner un une réponse précise. Cependant, je vais vous donner un exemple plus général, peut-être que cela vous aide à comprendre.

var all_brands_that_sell_shoes = /* But not always ONLY shoes */ 
     myDataContext.Brands 
        .Where(brand => 
           brand.Products.Any(product => 
                  product.Type == "Shoe") 
          ) 
        .ToList(); 

Modifier

Si je relis votre question, vous ne voulez pas dire que les propriétés de la classe Product ne sont pas connues avant l'exécution; mais que vous ne savez pas à l'avance quels filtres doivent être appliqués et lesquels doivent être sautés?

Cette deuxième réponse suppose que c'est ce que vous voulez. Encore une fois, je ne connais pas les propriétés de votre classe puisque vous ne les avez pas affichées, alors j'invente mes propres champs pour l'exemple.

Tout d'abord, créez un objet comme ci-dessous. Il sera utilisé pour regrouper tous les filtres que vous souhaitez appliquer à la sélection:

public class MySearchCriteria 
{ 
    public string ProductName_Contains { get; set; } 
    public int ProductWeight_LessThan { get; set; } 
    public int ProductType_Id   { get; set; } 
} 

Lorsque vous souhaitez filtrer la liste, vous passez un objet MySearchCriteria à la méthode:

public List<Brand> GetFilteredList(MySearchCriteria filters) 
{ 
    var brands = myDataContext.Brands; //All brands (for now) 

    if(filters.ProductType_Id > 0) 
    { 
      //IF the filter has a value, filter the list accordingly: 
      brands = brands.Where(brand => brand.Products.Any(product => product.TypeId == filters.ProductType_Id); 
    } 

    if(filters.ProductWeight_LessThan > 0) 
    { 
      //IF the filter has a value, filter the list accordingly: 
      brands = brands.Where(brand => brand.Products.Any(product => product.Weight < filters.ProductWeight_LessThan)); 
    } 

    if(!String.IsNullOrWhiteSpace(filters.ProductName_Contains)) 
    { 
      //IF the filter has a value, filter the list accordingly: 
      brands = brands.Where(brand => brand.Products.Any(product => product.Name.Contains(filters.ProductName_Contains))); 
    } 

    return brands.ToList(); 
} 

Cette méthode fait Assurez-vous que la liste a été filtrée en fonction du code SearchCriteria fourni.

Si vous n'utilisiez pas le champ filters.ProductName_Contains par exemple, ce serait une chaîne vide, et l'évaluation de cas vous aurait empêché de filtrer sur la base d'une chaîne vide. À la fin, vous n'auriez pas appliqué un filtre basé sur le nom.

J'espère que c'est la réponse que vous recherchiez? Si ce n'est pas le cas, veuillez en dire plus car j'ai du mal à comprendre ce que vous voulez.

+0

Ce que vous avez écrit ci-dessus ** product.Type ** le type est champ de la classe Produit. L'utilisation sélectionner les champs any tels que Type ou Product Name ou CreatedDate ..etc et la valeur appropriée avec respectif. Les données de requête que je veux sont n'importe quel champ dans Product.Type avec sa valeur respective. – Binod

+0

Ceci ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son article. – thomaux

+0

ma mention de 'product.type' était un exemple. Puisque vous n'avez pas affiché le contenu de la classe, je ne sais pas ce qui est et n'est pas là. Mais en lisant votre commentaire, vouliez-vous dire que ** les champs que vous voulez filtrer ne sont connus qu'à l'exécution ** ou que les propriétés ** de la classe ne sont connues qu'à l'exécution **? Je pense que tout le monde réagit en assumant la deuxième option, qui est dans une certaine mesure absurde. Si la première option est correcte (vous voulez filtrer sur certains champs, mais pas toujours), je peux vous donner la réponse dont vous avez probablement besoin. – Flater