设想情况:
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。
发布于 2012-06-10 03:43:29
似乎您正在执行LINQ查询,因为您的DB上下文是绑定到数据库连接上的。在这样做时,您将向数据库发出一个查询。考虑一下正在构建的查询:
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 };
我可能不明白你到底想做什么,但希望这能帮上忙。如果我遗漏了什么,请告诉我,我会澄清我的答案。
UPDATE:我更新了我建议的LINQ语句,以搜索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-10 03:56:42
如果您在任何字段中查找包含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();
第一个选项在我看来更好的网站搜索。第二个选项要求用户了解所有三个字段才能找到某个人。
发布于 2012-06-10 04:05:21
为什么不行?
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 };
https://stackoverflow.com/questions/10968306
复制