费话不多说,直接上问题和代码:
数据操作层代码:
public BaseDAL(DbContext context)
{
this.baseContext = context;
this.objectSet = this.baseContext.Set<T>();
}
/// <summary>
/// 根据条件查询数据库,并返回对象集合
/// </summary>
/// <param name="match">条件表达式</param>
/// <returns></returns>
public virtual ICollection<T> Find(Expression<Func<T, bool>> match)
{
return this.objectSet.Where<T>(match.Compile()).AsQueryable().ToList();
}
数据库内的数据:
业务层调用数据层方法:
OPERATIONBLL operationBll = new OPERATIONBLL();
string phoneInsNumber="460028186290192";
if (!string.IsNullOrEmpty(phoneInsNumber))
{
var existsModel = userPhoneBll.Find(t => t.PHONEINSNUMBER == phoneInsNumber).ToList();
//截取IMSI号的前5位
string imsiCode = phoneInsNumber.Substring(0, 5);
//IMSI查找 运营商
var operationCodeFindByImsi = operationBll.Find(t => t.IMSICODE.Contains(imsiCode)).FirstOrDefault().OPERATIONCODE; //IMS查找运营商
string numberThiree = string.Empty;
//手机号前三位查找 运营商
string operationCodefindByPhoneNumber = string.Empty;
string phoneNumber = "15818646017";
if (!string.IsNullOrEmpty(phoneNumber))
{
numberThird = phoneNumber.Substring(0, 3);
var _operationbyNumber = operationBll.Find(t => t.NUMBERREGOIN.Contains(numberThird ));
if(_operationbyNumber!=null)
{
operationCodefindByPhoneNumber = _operationbyNumber.FirstOrDefault().OPERATIONCODE;
}
}
}
业务规则:
即根据手机卡的IMSI 和手机号的前三位分别去识别所属的运营商,并返回运营商的编码
在上面的方法中,都是使用的FIND方法,使用Contains方法判断是否包含是否存在查询的字符,第一个FIND的调用正常返回结果,但是第二FIND的调用却报"未将对象引用设置到对象的实例"
第一个find是有值的:
第二个FIND报错:
在此有点想不明白,同一个对象,调用FIND两次,第一次取得到,第二次就报错,尝试到数据层修改数据的方法:
public virtual ICollection<T> Find(Expression<Func<T, bool>> match)
{
return this.objectSet.Where<T>(match.Compile()).AsQueryable().ToList();
}
改为:重写一个方法,去掉Compile()
public virtual ICollection<T> Find(Expression<Func<T, bool>> match)
{
return this.objectSet.Where<T>(match).AsQueryable().ToList();
}
之后在第二次的调用中调用上面的方法,则能正常的返回数据结果.
现在问题就是一个类的同一个方法,为什么不能使用Contains 做条件两次?请各位大神指点
应该是因为NUMBERREGOIN这个字段有为null的值。。
你的意思说 在数据库内的 其它 的那个字段的 NULL的原因?
@beggar_: 是的
@小白菜T: 一会我试下是否这人原因,那为什么第二个方法去掉了Compile()后就可以呢,可以理解为加上Compile()后不支持NULL,不加上就支持? 有没有办法兼容?