场景:
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。
答案 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 };