1. dbContext里配置 ,core 3.1(详见官网:https://docs.microsoft.com/en-us/ef/core/miscellaneous/logging?tabs=v3):
public class BloggingContext : DbContext
{
#region DefineLoggerFactory
public static readonly ILoggerFactory MyLoggerFactory
= LoggerFactory.Create(builder => { builder.AddConsole(); });
#endregion
public DbSet<Blog> Blogs { get; set; }
#region RegisterLoggerFactory
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLoggerFactory(MyLoggerFactory) // Warning: Do not create a new ILoggerFactory instance each time
.UseSqlServer(
@"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");
#endregion
}
2. dotnet run,看看sql:
3.看看我的code
/// <summary>
/// 分页返回 module
/// </summary>
/// <param name="id"></param>
/// <param name="title"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public PagedList<DocumentModuleResponse> GetAllByDocId(int id, string title,int pageIndex,int pageSize)
{
return _documentModuleRepository.TableNoTracking.Include(i => i.SourceFile)
.Where(w => (id == 0 || w.DocId == id) && (string.IsNullOrEmpty(title) || w.Title.Contains(title)))
.Select(s => new DocumentModuleResponse
{
Id = s.Id,
Name = s.SourceFile.Name,
Title = s.Title,
Status = s.Status,
RuleCodeId = s.RuleCodeId,
NodeNo = s.NodeNo,
NodeType = s.NodeType,
DocId = s.DocId,
Html = s.Html
})
.ToPagedList(pageIndex, pageSize);
}
4.如果传个非空title?
5.结论:可见,EF很好的支持 IsNullOrEmpty ,Contains 等基础函数方法。遇到过有些function,EF转sql会不支持,但这么基础的,EF还是没问题的。
6.回头看第一个图,绿色上面已经有sql了?不需要配置??
于是,去掉dbContext里那句UseLoggerFactory,绿色 没了。(本来控制台就是可以查看的啊!)
7.有人用debug ,参考https://www.cnblogs.com/fancyblogs/p/10535214.html
public static readonly LoggerFactory MyLoggerFactory = new LoggerFactory(new[] {
new DebugLoggerProvider()
});
//public static readonly ILoggerFactory MyLoggerFactory
// = LoggerFactory.Create(builder => { builder.AddConsole(); });
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//optionsBuilder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
//optionsBuilder.UseMySql()
//if (!optionsBuilder.IsConfigured)
//{
//var loggerFactory = LoggerFactory.Create(builder =>
//{
// builder.AddFilter("Microsoft", LogLevel.Warning)
// .AddFilter("System", LogLevel.Warning)
// //.AddFilter("SampleApp.Program", LogLevel.Debug)
// .AddConsole();
//});
optionsBuilder.UseLoggerFactory(MyLoggerFactory).UseSqlServer("Server=zhoudelun.oldcoder.com,7000;Database=DB1;Uid = sa;Pwd =123;");
//}
}
vs输出窗口:
8.废话
为什么记这个?昨天有同事说 .Where(w => string.IsNullOrEmpty(title) || w.Title.Contains(title)) 这种写法不好
不可读,有安全隐患。
我挺郁闷的,我这是跟官网里学那个mvc3+EF 里虚拟大学demo看的。