【问题标题】:Implement Smart Search with Entity framework使用实体框架实现智能搜索
【发布时间】:2017-03-28 05:24:03
【问题描述】:

我正在尝试在我的 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 会非常慢。我想要一种不会影响性能的可扩展方法。

【问题讨论】:

  • 您的数据库中有品牌和年份的索引吗?
  • @Vecchiasignora 没有。我刚刚创建了这两个类。有必要吗?
  • 是的,如果您的表中有大数据,如果没有品牌和年份的任何索引,它会很慢
  • 在你的例子中会有'and'而不是'or'
  • @Vecchiasignora 创建索引。是的,我需要'and'关键字。你能举个简单的例子吗?这将非常有帮助。

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


【解决方案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); like this DbSet&lt;ProductEntity&gt; 或您的数据访问层 db.(member) 将您的 dbset 作为 list/enumarableProductEntity

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

【讨论】:

    【解决方案2】:

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

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

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

    https://github.com/OData/WebApi

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 2015-07-25
      • 1970-01-01
      相关资源
      最近更新 更多