文章内容

C# mvc EF int 模糊查询(Contains)的解决方法

  • 2018-08-10 23:23:11
  • 413
  • 0
  • 0

表结构:

image.png

image.png

查询条件:职位ID,根据职位ID查找对应职位信息,如果选择ALL则查询全部。

第一次ef代码:var list = agv.agv_role.Where(a => a.roleid.ToString().Contains(roleid));

 a.roleid.ToString():由于EF中 int没有模糊查询的概念,迫于无奈的尝试。


发现EF不支持ToString和Convert等方法(虽然代码不报错),执行后报错

LinQ to entities 不能识别方法“system.string.ToString(system.String)”.因此该方法无法转换为存储表达式

由于以上代码无法执行,故切换到了三元表达式处理并解决问题。

  1. 判断条件ID是否为空字符串"",(如果传入值为null还需要处理,这里本人能保证自己传过来的参数不为空(null),所以没写空判断)

  2. 如果不是空,那么声明一个int变量将Convert后的条件ID保存起来

  3. 在where条件中加入:roleid!=""?a.roleid==roleids:1==1

    这句话什么意思呢?  即:当roleid不是空字符串时,where就取a.roleid==roleids 。否则的话就是1==1(即不执行a.roleid条件查询,就查询全部ID了) 


完整代码如下:

 [HttpPost]
 public JsonResult rolelist_post(int limit, int offset, string roleid)
 {

     int roleids = -1;
     if (roleid != "") roleids = Convert.ToInt32(roleid);
     var list = agv.agv_role.Where(a => roleid != "" ? a.roleid == roleids : 1 == 1)
     .Select(b => new { b.id, b.roleid, b.rolename }).OrderBy(c => c.id);
     var total = list.Count();
     var data = list.Skip(offset).Take(limit).ToList();
     return Json(new { total = total, rows = data });
  }

如果有其他大神有更好的方法,欢迎评论指点,谢谢。