Entity Framework с динамическим Linq

1

Используя контекст 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. Поля продукта известны только во время выполнения. Как я могу создать выражение для поиска бренда с помощью полей продукта. См. Скриншот. Спасибо, Бинод

Изображение 174551

Теги:
linq
entity-framework
dynamic-linq

1 ответ

0

Во-первых, я немного неясен в этой части вашего вопроса:

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-оценка предотвратила бы фильтрацию на основе пустой строки. В конце концов, вы не использовали бы фильтр на основе имени.

Надеюсь, это тот ответ, который вы искали? Если нет, пожалуйста, уточните, так как мне трудно понять, что именно вы хотите.

  • 0
    То , что вы написали в выше product.Type типа является поле класса продукта. При использовании выберите любые поля, такие как Тип или Имя продукта или CreatedDate ..etc и соответствующее значение с соответствующим ему. Данные запроса, которые я хочу, - это любое поле в Product.Type с соответствующим значением.
  • 0
    Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под своим постом.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню