1

设想:

 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 的转换。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NotSupportedException:方法“System.String Format(System.String, System.Object, System.Object, System.Object)”不支持对 SQL 的转换。

任何人都可以让我知道为什么我无法以这种方式搜索以及此搜索的任何替代方法吗?

这是我计划实现的目标:

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

通过使用 LINQ。

4

3 回答 3

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 - where 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

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

希望这可以帮助。

于 2012-06-10T11:43:29.667 回答
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 个字段才能找到某人。

于 2012-06-10T11:56:42.913 回答
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 };
于 2012-06-10T12:05:21.567 回答