首页 新闻 会员 周边

EntityframeWork数据操作过程中使用Contains的诡异错误

0
悬赏园豆:5 [已解决问题] 解决于 2015-07-12 20:57

费话不多说,直接上问题和代码:

数据操作层代码:

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 做条件两次?请各位大神指点

beggar_的主页 beggar_ | 初学一级 | 园豆:10
提问于:2015-07-09 17:45
< >
分享
最佳答案
0

应该是因为NUMBERREGOIN这个字段有为null的值。。

收获园豆:5
小白菜T | 小虾三级 |园豆:564 | 2015-07-09 20:05

你的意思说 在数据库内的  其它  的那个字段的 NULL的原因?

beggar_ | 园豆:10 (初学一级) | 2015-07-09 21:24

@beggar_: 是的

小白菜T | 园豆:564 (小虾三级) | 2015-07-09 23:11

@小白菜T: 一会我试下是否这人原因,那为什么第二个方法去掉了Compile()后就可以呢,可以理解为加上Compile()后不支持NULL,不加上就支持? 有没有办法兼容?

beggar_ | 园豆:10 (初学一级) | 2015-07-10 08:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册