C# 用实体框架实现智能搜索
我正在尝试在ApicController中实现搜索功能。我想做的是:为客户端创建api,该api将采用单个字符串作为输入,如“Nike 2016”。我的api应该只返回“Nike”品牌和“2016”年的记录 下面是我的模型课我正在使用实体框架。C# 用实体框架实现智能搜索,c#,entity-framework,linq,asp.net-web-api,ef-code-first,C#,Entity Framework,Linq,Asp.net Web Api,Ef Code First,我正在尝试在ApicController中实现搜索功能。我想做的是:为客户端创建api,该api将采用单个字符串作为输入,如“Nike 2016”。我的api应该只返回“Nike”品牌和“2016”年的记录 下面是我的模型课我正在使用实体框架。 class ProductEntity { public int Year { get; set; } public string TAGS { get; set; } public Dimensi
class ProductEntity
{
public int Year { get; set; }
public string TAGS { get; set; }
public Dimension Dimension { get; set; }
public int Rating { get; set; }
public string UserId { get; set; }
public string Brand { get; set; }
public double NumberOfFloors { get; set; }
public string CostOfBuilding { get; set; }
}
class Dimension
{
public double length { get; set; }
public double width { get; set; }
}
我曾尝试在所有列中使用“或”关键字进行搜索,但使用这种方法,我担心api会非常慢。我想要一种不会影响性能的可扩展方法。尝试创建过滤器,并使用过滤器参数初始化它,如下所示
var filter = new Filte {Brand = ..., Year = ....}
........
public class Filter
{
public string Brand { get; set; }
public int? Year { get; set; }
public IQueryable<ProductEntity> FilterObjects(IQueryable<ProductEntity> query)
{
if (!string.IsNullOrEmpty(Brand))
query = query.Where(x => x.Brand == Brand);
if (Year.HasValue)
query = query.Where(x => x.Year = Year);
}
}
var filter=newfilte{Brand=…,Year=…}
........
公共类过滤器
{
公共字符串品牌{get;set;}
公共整数?年份{get;set;}
公共IQueryable筛选器对象(IQueryable查询)
{
如果(!string.IsNullOrEmpty(Brand))
query=query.Where(x=>x.Brand==Brand);
如果(年份价值)
query=query.Where(x=>x.Year=Year);
}
}
在它之后,像这样调用FilterObject
var filter = new Filte {Brand = ..., Year = ....}
........
public class Filter
{
public string Brand { get; set; }
public int? Year { get; set; }
public IQueryable<ProductEntity> FilterObjects(IQueryable<ProductEntity> query)
{
if (!string.IsNullOrEmpty(Brand))
query = query.Where(x => x.Brand == Brand);
if (Year.HasValue)
query = query.Where(x => x.Year = Year);
}
}
var Query=filter.filterObject(您的实体数据库集)
像这样DbSet
或您的数据访问层db.(成员),它将您的DbSet
作为ProductEntity的list/enumable
而不是Query.ToList()
这将是您的数据库的最终请求,并且不要忘记indexis我意识到这是一个老问题,但我认为这可能会有一些帮助
另一种选择可能是使用OData,它可以对整个模型中所有基于实体的端点进行排序、过滤和分页
您的数据库中有按品牌和年份的索引吗?@vecchiasinora no。我刚刚创建了这两个类。有必要吗?是的,如果你的表中有大数据,那么如果没有品牌和年份的任何索引,它会很慢,在你的例子中,会有“和”和“不”或“@Vecchiasignora创建的索引”。是的,我需要“和”关键字。你能举个简单的例子吗?这将非常有帮助。