Linq字符串比较错误

时间:2012-06-10 11:31:28

标签: .net linq-to-sql

场景:

 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:Method'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。

3 个答案:

答案 0 :(得分: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

这并没有真正好转。我认为你要做的就是一个像...... 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

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

希望这有帮助。

答案 1 :(得分:1)

如果你在任何字段中查找包含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个字段以找到某人。

答案 2 :(得分:1)

为什么不呢?

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 };