C# 用实体框架实现智能搜索

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

我正在尝试在ApicController中实现搜索功能。我想做的是:为客户端创建api,该api将采用单个字符串作为输入,如“Nike 2016”。我的api应该只返回“Nike”品牌和“2016”年的记录

下面是我的模型课我正在使用实体框架。

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创建的索引”。是的,我需要“和”关键字。你能举个简单的例子吗?这将非常有帮助。