带有可选 Where 子句和 Sql Server CE 的 Linq

Posted

技术标签:

【中文标题】带有可选 Where 子句和 Sql Server CE 的 Linq【英文标题】:Linq with optional Where clauses and Sql Server CE 【发布时间】:2011-02-27 23:42:57 【问题描述】:

我有一个带有可选用户名字段的搜索表单。如果未提供用户名,则应返回所有匹配项。

我正在使用 Linq 和 Sql Server CE 4.0。

linq 代码如下所示 ->

from p in context.Accounts
where (name==string.Empty || p.UserName.Contains(name))

使用 Sql Server CE 会引发以下错误

“此位置不允许有参数。请确保'@'符号位于有效位置或此 SQL 语句中的参数完全有效。”

我可以采取其他方法在 Linq 中使用可选的 Where 子句吗?

仅供参考

from p in context.Accounts
where (string.IsNullOrEmpty(name) || p.UserName.Contains(name))

给我错误

"为函数指定的参数值无效。[参数# = 1,函数名称(如果已知) = isnull]"

这是由于 Sql Server CE 不支持 IsNull。如果 Name 参数为 Null,我只需执行以下操作。

if (name == null)
    name = string.Empty;

【问题讨论】:

【参考方案1】:

试试这个:

var query = from p in context.Accounts
            select p;

if (!string.IsNullOrEmpty(name)) 
    query = query.Where(p => p.UserName.Contains(name));

没有规定查询必须在单个语句中。您可以添加到现有查询,直到您实际执行它为止。

【讨论】:

执行时会编译成一条sql语句吗?或者它会提取所有帐户然后过滤等。比如假设我有 10,000 个帐户,它们会全部被拉入内存然后过滤吗? @Kenoyer130,它会编译成一条sql语句。 @Kenoyer130 你应该阅读一些关于 LINQ 延迟执行的内容,否则会有你无法理解的惊喜和错误;)

以上是关于带有可选 Where 子句和 Sql Server CE 的 Linq的主要内容,如果未能解决你的问题,请参考以下文章

sql Where子句中的可选参数

LINQ to SQL Where 子句可选条件

如何强制 SQL Server 在 WHERE 子句之前处理 CONTAINS 子句?

在 WHERE 子句中使用可选条件的正确方法

带有 JOIN 和 WHERE 子句的 SQL 语句

SQL Server 中带条件的 Where 子句