一、varchar类型字段如果为null 无法使用contains来判断是否包含字符串
1. 有问题的代码:
contractList = _dbcontext.contractHeads.Where(u => u.code.Contains(queryStr) || u.name.Contains(queryStr) || u.companyName.Contains(queryStr) || u.customerName.Contains(queryStr) ||u.note.Contains(queryStr)).ToList();
2. 问题点:
当note字段中存在null的情况下会报错,想想也正常,如果null是无法调用contains方法的。
3. 解决方案:
通过三目运算来判断:
u.note ==null?false:u.note.contains(queryStr)
到这里原本以为问题解决了,但是发现还是不行
contractList = _dbcontext.contractHeads.Where(u => u.code.Contains(queryStr) || u.name.Contains(queryStr) || u.companyName.Contains(queryStr) || u.customerName.Contains(queryStr) ||u.note ==null?false:u.note.contains(queryStr)).ToList();
4. 新的问题点
这样写相当于 u.code.Contains(queryStr) || u.name.Contains(queryStr) || u.companyName.Contains(queryStr) || u.customerName.Contains(queryStr) ||u.note ==null 是在做三目运算的判断,这样是达不到我们的需求的。
5. 正确的代码:
将三目运算放到括号里面
contractList = _dbcontext.contractHeads.Where(u => u.code.Contains(queryStr) || u.name.Contains(queryStr) || u.companyName.Contains(queryStr) || u.customerName.Contains(queryStr) || (u.note ==null?false:u.note.contains(queryStr))).ToList();
二、Code First模式下,如果模型类引用了另外一个类,实际查询过程中会用到另外一个类的字段的。
1. 具体场景:
[Table("BomBody")]public class BomBody{public Guid Id { get; set; } public BomHead bomHead { get; set; } public Production production { get; set; }[Column(TypeName = "decimal(18,4)")]public decimal num { get; set; }[Column(TypeName ="varchar(500)")]public string? note { get; set; }public bool ifDel { get; set; }}[Table("Production")]
public class Production
{[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]public Guid id { get; set; } //IDpublic string name { get; set; }public string productionModel { get; set; }public bool isProduction { get; set; } public Units unit { get; set; } }
2. 实际业务过程中如果 var bomBody =_dbcontext.Bombodies.toList(); 然后访问bomBody.production.name 访问是会报错的。 bomBody.production 为null
3. 解决办法:
var bomBody = _dbcontext.BomBodies.include(u=>u.production).toList();
需要把production给include 进去。
三、表格手机端显示优化的方案
1. 使用bootstrap表格的table-responsive-md/sm
会自己根据你选择的表格宽度大小生成一个横向的滚动条。第一次用这个时候发现死活都不生效,那么就是你要手工去除掉 td tr 自动换行
2. 很原始但很有效的一个方案:
如果是pc端那么就显示表格,如果是手机端那么就显示为card。效果如下