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

なぜだめですか?

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 に答える
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 を 3 つのフィールドすべてを組み合わせて比較するコードです。遅いので注意。

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();

最初のオプションは、サイト検索に適しています。2 番目のオプションでは、ユーザーが誰かを見つけるために 3 つのフィールドすべてを知っている必要があります。

于 2012-06-10T11:56:42.913 に答える
1

DB コンテキストがデータベース接続に関連付けられているため、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 };

あなたが何をしようとしているのか正確には理解できないかもしれませんが、これが役に立てば幸いです。何か不足している場合はお知らせください。答えを明確にします。

UPDATE : 提案された 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 に答える