【问题标题】:Linq string compare errorLinq 字符串比较错误
【发布时间】:2012-06-10 11:31:28
【问题描述】:

场景:

 const string srchFormatter = "{0} {1} {2}";

 var result = from c in db.ContactsDumps1s
                     where string.Format(srchFormatter, c.FirstName, c.MiddleName, c.LastName).Contains(txtSearch.Text.Trim())
                     select new { c.FirstName, c.MiddleName, c.LastName };

错误:

方法 'System.String Format(System.String, System.Object, System.Object, System.Object)' 不支持对 SQL 的转换。

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:System.NotSupportedException:方法'System.String 格式(System.String,System.Object,System.Object,System.Object)' 没有支持的 SQL 转换。

谁能告诉我为什么我无法以这种方式搜索以及此搜索的任何替代方法?

这是我计划实现的目标:

select FirstName, MiddleName, LastName 
from ContactsDumps1 
where FirstName+MiddleName+LastName like '%Search_String%'

通过使用 LINQ。

【问题讨论】:

  • 不要用粗体字过分强调你的整个问题——这完全没有必要而且适得其反。
  • @marc_s 以获得更好的可见性! :)

标签: .net linq-to-sql


【解决方案1】:

似乎您正在执行 LINQ-to-SQL 查询,因为您的数据库上下文与数据库连接相关联。在执行此操作时,您正在向数据库发出查询。考虑一下您正在构建的查询:

from c in db.ContactsDumps1s
                     where string.Format(srchFormatter, c.FirstName, c.MiddleName, c.LastName).Contains(txtSearch.Text.Trim())
                     select new { c.FirstName, c.MiddleName, c.LastName };

这可能翻译为:

SELECT FN, MN, LN
FROM ContactsDumps1s
WHERE 'FN FN FN' Contains SomeTextValue

这确实翻译得不好。我认为你想要做的是一个 LIKE - FirstName Starts With SomeTextValue

所以你可能想试试:

    from c in db.ContactsDumps1s
    where c.FirstName.StartsWith(txtSearch.Text.Trim()) ||
          c.MiddleName.StartsWith(txtSearch.Text.Trim()) ||
          c.LastName.StartsWith(txtSearch.Text.Trim())
    select new { c.FirstName, c.MiddleName, c.LastName };

我可能不明白您到底想做什么,但希望这会有所帮助。如果我遗漏了什么,请告诉我,我会澄清我的答案。

更新:我更新了建议的 LINQ 语句以在 txtSearch 中搜索 FirstName、MiddleName 或 LastName 的文本。

更新 #2:我注意到您更新的问题以及您想要做什么。以下是一种可能适合您的方法:

from c in db.ContactsDumps1s
where (c.FirstName + " " + c.MiddleName + " " + c.LastName).StartsWith(txtSearch.Text.Trim())
select new { c.FirstName, c.MiddleName, c.LastName };

使用 LINQPad,我做了类似的事情,从中生成的 SQL 是:

SELECT [t0].[FirstName], [t0].[MiddleName], [t0].[LastName]
FROM [SalesLT].[Customer] AS [t0]
WHERE (([t0].[FirstName] + @p0) + ([t0].[MiddleName] + @p0) + [t0].[LastName]) LIKE @p1

这大致可以转化为您想要做的事情。

希望这会有所帮助。

【讨论】:

  • 最后一个查询只搜索名字,我也在寻找中间和最后一个
  • 通过搜索 FirstName、MiddleName 或 LastName 更新了我的建议答案。
【解决方案2】:

为什么不呢?

var result = from c in db.ContactsDumps1s
             where (c.FirstName + " " + c.MiddleName + " " + c.LastName)
                 .Contains(txtSearch.Text.Trim())
             select new { c.FirstName, c.MiddleName, c.LastName };

【讨论】:

    【解决方案3】:

    如果您在任何字段中查找包含 txtSearch.Text 的行,您可以使用类似的方法

    var result = from c in db.ContactsDumps1s
    where c.FirstName.Contains(txtSearch.Text.Trim()) ||
    c.MiddleName.Contains(txtSearch.Text.Trim()) || 
    c.LastName.Contains(txtSearch.Text.Trim())
    select new { c.FirstName, c.MiddleName, c.LastName };
    

    这是将 db.ContactsDumps1s 与所有三个字段相结合的代码。小心它很慢。

    var result = (from c in db.ContactsDumps1s
        select new { c.FirstName, c.MiddleName, c.LastName, 
        Combined = c.FirstName + c.LastName + c.MiddleName})
        .Where(u => u.Combined.Contains(txtSearch.Text.Trim())).ToArray();
    

    第一个选项在我看来更适合网站搜索。第二个选项将要求用户知道所有 3 个字段才能找到某人。

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 2014-11-28
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多