Необходимо убедиться, что свойство Model
модели поиска не равно нулю и передано действию, тогда при поиске необходимо убедиться, что свойство Model
элемента в запросе linq не равно нулю, затем сравните свойство MakeID
модели поиска со свойством MakeID
элемента в запросе linq. Например, если вы собираетесь искать по MakeID
из Model
, если он указан, вам нужно изменить код на следующий:
if (searchModel.Model !=null && searchModel.Model.MakeID.HasValue)
result = result.Where(x => x.Model !=null &&
x.Model.MakeID == searchModel.Model.MakeID);
Однако, если вы следуете этот пост , в общем, лучше следовать этим советам:
- Не используйте модель Entity в качестве модели поиска POCO.
- Не размещайте бизнес-логи c в вашем классе POCO.
- Если вы собираетесь выполнять поиск по MakeID, включите его непосредственно в модель поиска POCO.
Пример
Я расширю пример из связанного поста, так что Product
также имеет свойство Category
, и мы заинтересованы в поиске на основе CategoryName
, а также некоторых других свойств:
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Product
{
public int Id { get; set; }
public int Price { get; set; }
public string Name { get; set; }
public int CategoryId { get; set; }
public Category Category { get; set; }
}
Вы можете создать класс ProductSearchModel
и поместить на его основе несколько полей, которые вы хотите найти:
public class ProductSearchModel
{
public int? Id { get; set; }
public int? PriceFrom { get; set; }
public int? PriceTo { get; set; }
public string Name { get; set; }
public string CategoryName { get; set; }
}
Затем вы можете поместить свою логику поиска c в ProductBusinessLogic
класс таким образом :
public class ProductBusinessLogic
{
private YourDbContext Context;
public ProductBusinessLogic()
{
Context = new YourDbContext();
}
public IQueryable<Product> GetProducts(ProductSearchModel searchModel)
{
var result = Context.Products.AsQueryable();
if (searchModel != null)
{
if (searchModel.Id.HasValue)
result = result.Where(x => x.Id == searchModel.Id);
if (!string.IsNullOrEmpty(searchModel.Name))
result = result.Where(x => x.Name.Contains(searchModel.Name));
if (searchModel.PriceFrom.HasValue)
result = result.Where(x => x.Price >= searchModel.PriceFrom);
if (searchModel.PriceTo.HasValue)
result = result.Where(x => x.Price <= searchModel.PriceTo);
if (!string.IsNullOrEmpty(searchModel.CategoryName))
result = result.Where(x => x.Category !=null &&
x.Category.Name.Contains(searchModel.Name));
}
return result;
}
}