在一次耗时日志分析的时候发现一个请求走了10几秒。经过对接口逻辑的分析,终于发现了问题所在。
平时在使用linq查询数据库多条数据的时候,我们一般会用到where+select+toList()的方式。
但下面两种方式,第一种比第二种查询速度快很多倍。
第一种写法:
var newsList = repository.DbContext.Set().Where(m => m.EventId == eventId && m.Type == (sbyte)EPromotiePageType.News).Select(m => new NewsTitleModel { Id = m.Id, Title = m.Title, Type = m.Type, FileUrl = m.FileUrl, NewsCategory = m.NewsCategory, CreateDate = m.CreateDate}).ToList();
第二种写法:
var newsList = repository.DbContext.Set().Where(m => m.EventId == eventId && m.Type == (sbyte)EPromotiePageType.News).Select(m => new NewsTitleModel(m)).ToList();
public class NewsTitleModel
{
public string FileUrl { get; set; }
public int Id { get; set; }
public string Title { get; set; }
public sbyte Type { get; set; }
public string NewsCategory { get; set; }
public DateTime CreateDate { get; set; }
public List AppendixList { get; set; }
public NewsTitleModel()
{
}
public NewsTitleModel(WebInfoSetUp model)
{
this.Id = model.Id;
this.FileUrl = model.FileUrl;
this.Title = model.Title;
this.Type = model.Type;
this.NewsCategory = model.NewsCategory;
this.CreateDate = model.CreateDate;
}
}
原因在于,
第一种方式(响应时间几百毫秒)用的select转成sql语句之后是:
select(Id,Title,Type,FileUrl,NewsCategory,CreateDate) from WebInfoSetUp where EventId = {某Id} and Type = 1.
第二种却是:(响应时间几秒钟)
select * from WebInfoSetUp where EventId = {某Id} and Type = 1.
之所以 select * 比 select 几个字段快很多倍,就在于刚好我这张表是新闻表,表结构里有一个正文字段,用于存储新闻资讯的富文本格式。
看来linq for Entity 对于select内使用构造函数是不会进行解析的。看到select内用m进行传参构造还是的时候就直接解析成了 select *



