2010-07-16 114 views
2

我有一个很长的LinqtoSQl查询,其中几个参数我不强迫用户指定任何东西。我开始使用Select Case语句来测试参数字符串的长度是否大于0或者是否大于0。但是我意识到必须测试每种可能性并根据每种可能性创建查询。LINQTOSql缺少参数问题

我做了一些搜索并跑过一篇帖子,回复帖子的人说这个帖子否定了查询的一部分||。在做了一些更多的搜索(并且实现了很少的C#技能后,我确实知道||是OR条件语句),我意识到这对我没有帮助。

我想我想要做的是一样的东西

Dim r = From x in db.List _ 
     (if firstName.Length < 1 then ignore query 
     else)where x.firstName = firstName _ 
     (if lastName.Length < 1 then ignore query 
     else)where x.LastName = lastName _ 
     Select x 

我KNW必须有比通过这个IfElse'ing我的方式更好的办法......我正要做一些时髦的东西与一个StringBuilder,但我不知道它会“火”,即:

Dim sb as New StringBuilder 
sb.Append("Dim r = From x in db.List _") 
If firstName.Length < 1 then 
    sb.Append("Where x.firstName = firstName") 

ughh,请告诉我有一个更好的办法...

感谢您的帮助!

回答

2

使用查询可组合的事实。我会用C#编写这个代码,然后将它翻译成VB,如果你需要的话。原则是一样的。

IQueryable<YourEntityType> query = db.List; 
if (firstName != "") 
{ 
    query = query.Where(x => x.firstName == firstName) 
} 
if (lastName != "") 
{ 
    query = query.Where(x => x.lastName == lastName) 
} 

现在刚刚从query适当读。 (我已经改变了字符串条件的性质,因为它更容易理解“这个字符串是空字符串”而不是“这个字符串的长度大于0” - 两者都会工作,显然)。

请注意,您不能在查询表达式中进行这种条件调用,但当您只是明确调用扩展方法时很容易。

+0

我想我需要你来翻译这对我来说... 我喜欢这个想法,但... 我试图 昏暗查询作为的IQueryable(名单)= db.List query.Where(x => x.firstName == firstName) 但intellesense去尝试输入其他东西,然后我得到警告和错误,未声明x ... 谢谢! – wali 2010-07-16 19:47:08

+0

只是想通了... query.Where(函数(x)x.firstName = firstName) 傻VB! 非常感谢! – wali 2010-07-16 20:08:20

0

......怎么

Dim r = From x in db.List _ 
     where (x.firstName = firstName Or firstName = "") _ 
     And (x.LastName = lastName Or lastName = "") _ 
     Select x 
+0

名字和姓氏字段是不可空的,所以firstName =“”永远不会返回true ... 我只是不让用户在搜索过程中指定一个名字... 谢谢! – wali 2010-07-16 19:51:20