使用实体框架实施智能搜索

时间:2017-03-28 05:24:04

标签: c# entity-framework linq asp.net-web-api ef-code-first

我正在尝试在我的ApiController中实现搜索功能。我想要做的是:为客户创建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会非常慢。我想要一种不会影响性能的可扩展方法。

2 个答案:

答案 0 :(得分:1)

尝试使用您的过滤器参数创建过滤器并使用此

进行初始化
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);

            }

        }

之后调用像这样的FilterObjects

var Query = filter.FilterObjects(your dbset of entity);喜欢这个DbSet<ProductEntity>或您的数据访问层db。(成员),dbsetlist/enumarable ProductEntity

而不是Query.ToList()将是对您的数据库的真正最终请求,并且不要忘记indexis

答案 1 :(得分:0)

我意识到这是一个老问题,但我认为这可能对某些人有帮助...

另一种选择是使用OData在整个模型中所有基于实体的端点上对过滤和分页进行排序。

http://odata.github.io/WebApi/

https://github.com/OData/WebApi