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.
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? –
Exactement ce que vous voulez atteindre et s'il vous plaît montrer les champs qui relient ces deux classes. –
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 .. –