Linq模糊查询
这句代码如何写出模糊查询。
List<Objects> objs;
IEnumerable<Objects> fiterObjs = objs.Where(x => x.ObjectName==this.acbObjectName.Text.Trim());
我试了这样子写,可是不行
IEnumerable<Objects> fiterObjs = objs.Where(x => x.ObjectName.Contains(this.acbObjectName.Text.Trim()));
[最优解释]
SqlMethods.Like 是生成sql语句时,应该 不能用。
既能 ObjectName可能为null,加上判断 。
IEnumerable<Objects> fiterObjs = objs.Where(x => x.ObjectName!=null&&x.ObjectName.Contains(this.acbObjectName.Text.Trim()));
[其他解释]
提示:未将对象引用设置到对象的实例。
但是上面的那个精确查询可以的。
[其他解释]
IQueryable <T>接口本来就没有Contains方法
from o in db.Orders
where (
new string[] { "A", "B", "C" })
.Contains(o.ID)
[其他解释]
可以的,没有问题的,再检查一下。
[其他解释]
光看代码 是没有问题的。
未将对象引用设置到对象的实例 是指哪个? 调试一下
[其他解释]
我改写成 var fiterObjs = from i in objs where i.ObjectName.Contains(this.acbObjectName.Text.Trim()) select i;也是一样的。
郁闷
[其他解释]
我测试了一下contans方法,搞一个静态数据源:
class Program
{
static void Main(string[] args)
{
List<User> lstUesr = new List<User>() { new User{Id="sdf",Name="wfuc"},
new User{Id="sfdds",Name="sdfwer"},
new User{Id="iuy",Name="ljk"},
new User{Id="iuy",Name="ab"},
new User{Id="iuy",Name="abc"},
new User{Id="iuy",Name="eabc"},
new User{Id="iuy",Name="rabre"},
new User{Id="iuy",Name="tabtrc"}
};
IEnumerable<User> query = lstUesr.Where(x => x.Name.Contains("ab"));
foreach (User item in query)
{
Console.WriteLine(item.Name);
}
}
}
上面demo是Ok的
[其他解释]
x.ObjectName为null
[其他解释]
加一个括号你试试:
var fiterObjs = (from i in objs select
i.ObjectName).Contains(this.acbObjectName.Text.Trim());
[其他解释]
var filterObjs=from i in objs where SqlMethods.Like(i.ObjectName,"%"+this.acbObjectName.Text.Trim()+"%") select i;
[其他解释]
x.ObjectName为null
[其他解释]
自己用foreach过滤好了
[其他解释]
上面的应该行的了,如果实在不行就循环算了!
[其他解释]
你这个代码应该没什么错误。看你调用ObjectName.Contains()这个方法,我想这个ObjectName应该是一个string类型的吧,所以调用这个方法没什么错误。
但是既然引发了【未将对象引用设置到对象的实例。】,我瞅了瞅你的代码,能够引发这个异常的只有objs变量和x.ObjectName这个属性,或者是字段,不晓得你这个ObjectName是属性还是字段。^_^
我想你应该不至于没有为只是声明了一个objs变量,而没有进行实例化并提供数据吧。这样一来,就只剩下ObjectName可能为null这一种情况了。如果ObjectName为null的话,那它自然也就无法调用Contains这个方法了。解决问题的办法很简单,加上一个判断就可以了。不过我可以提供给你一个更直接的做法,就是再添加一个Where方法。如下面的代码:
IEnumerable<Objects> fiterObjs =
objs.Where(o => o.ObjectName != null).Where(x => x.ObjectName.Contains(this.acbObjectName.Text.Trim()));
这样就确保后一个Where()内部的x.ObjectName不可能为空。你测试测试吧!
另外,使用SqlMethods.Like()这个方法貌似不行吧,因为这个是LINQ to SQL的东西,而你现在使用的应该是LINQ to Objects吧,两个还是有点区别的。
还有,2楼和13楼的做法不可行。如果按照你的代码要求可能应该写成下面这样的,就比较合适了:
string [] Conditions = new string[]{this.acbObjectName.Text.Trim()};
IEnumerable<Objects> Result =
from O in objs
where Conditions.Contains(O.ObjectName)
select O;
也就是说,首先用你要查询的条件组合成一个string数组,然后调用此数组的Contains()方法。如果某个对象的ObjectName已经包含在这个数组中,那就会将这个对象返回给结果集。不过,初看起来我以为这个是一个模糊查询,实际上应该是一个精确查询吧!另外,this.acbObjectName.Text.Trim()的数据只可能是ObjectName的一个子集,因此,使用此法可能永远也找不到想要的数据。
不过,以上的说法只是理论推测,没有试验过!你用你的测试环境试验吧!然后把测试的结果贴上来,咱们再交流。
[其他解释]
你试下这个?
var obs =from i in objs
where i.ObjectName.indexOf(this.acbObjectName.Text.Trim())>=0
select i;