LINQTOSql缺少参数问题

时间:2010-07-16 19:35:20

标签: linq linq-to-sql

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

我做了一些搜索并遇到了一个帖子,其中回复帖子的人说要否定查询的一部分使用||。在做了一些更多的搜索(并且实现了很少的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

我知道必须有一个比IfElse更好的方式来解决这个问题......我准备用StringBuilder做一些时髦的东西,但我不确定它会“开火”,即:< / p>

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") 
嗯,请告诉我有更好的方法......

感谢您的帮助!

2 个答案:

答案 0 :(得分: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” - 显然都可以工作。)

请注意,您无法在查询表达式中执行此类条件调用,但只需明确调用扩展方法即可。

答案 1 :(得分:0)

怎么样......

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