Используя контекст EntityFramework, мне нужно выполнить поиск со многими полями.
EntityDBContext включает
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();
Я бы хотел поискать бренд с помощью поля в Product. Поля продукта известны только во время выполнения. Как я могу создать выражение для поиска бренда с помощью полей продукта. См. Скриншот. Спасибо, Бинод
Во-первых, я немного неясен в этой части вашего вопроса:
the fields of the product are only known at run time.
Как так? Можете ли вы рассказать об этом, потому что я не вижу в нем работы, использующей EF. Какова ваша таблица базы данных (Предположительно, для Products
)? Какие свойства находятся в этом классе?
Нам нужно знать это, прежде чем мы сможем дать вам точный ответ. Однако я дам вам более общий пример, возможно, это поможет вам понять.
var all_brands_that_sell_shoes = /* But not always ONLY shoes */
myDataContext.Brands
.Where(brand =>
brand.Products.Any(product =>
product.Type == "Shoe")
)
.ToList();
редактировать
Если я перечитаю ваш вопрос, вы не имеете в виду, что свойства класса Product
не известны до выполнения; но что вы заранее не знаете, какие фильтры необходимо применять и которые нужно пропустить?
Этот второй ответ предполагает, что вы хотите. Опять же, я не знаю свойств вашего класса, так как вы их не публиковали, поэтому я изобретаю свои собственные поля для примера.
Сначала создайте объект, как показано ниже. Это будет использоваться для объединения всех фильтров, которые вы хотите применить к выбору:
public class MySearchCriteria
{
public string ProductName_Contains { get; set; }
public int ProductWeight_LessThan { get; set; }
public int ProductType_Id { get; set; }
}
Если вы хотите отфильтровать список, вы передаете объект MySearchCriteria
в метод:
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();
}
Этот метод гарантирует, что список был отфильтрован в соответствии с предоставленной вами программой SearchCriteria
.
Если вы не использовали полевые filters.ProductName_Contains
Например, для filters.ProductName_Contains
, это была бы пустая строка, и if-оценка предотвратила бы фильтрацию на основе пустой строки. В конце концов, вы не использовали бы фильтр на основе имени.
Надеюсь, это тот ответ, который вы искали? Если нет, пожалуйста, уточните, так как мне трудно понять, что именно вы хотите.