1

SQL Server ではuniqueidentifier、LIKE 比較を使用して列を文字列のように使用できます。

SELECT * FROM dbo.Table WHERE GuidColumn LIKE '4c38e01e%'

Entity Framework でこの機能を使用するにはどうすればよいですか?

私はこのようなものが欲しい

context.Table.Where(x => x.StringColumn.Contains("some string"))

ただし、文字列列の代わりに Guid 列の場合:

context.Table.Where(x => x.GuidColumn ???? "4c38e01e")
4

2 に答える 2

4

私の知る限り、EntityFramework でその場で Guid を文字列に変換する方法はありません。私はいくつかの回避策を知っていますが、あなたの場合には役立つかもしれませんが、私にはエレガントではありません:

  1. Guid 列を文字列に変換する SQL サーバーでビューを作成します。次に、新しいエンティティを作成し、それをビューにマップします。これで、GUID 列が文字列表現になり、「like」演算子を適用できるようになりました。主な欠点はクエリのパフォーマンスです。
  2. 文字列型の PERSISTENT 計算列を作成します。convert 式を使用して、Guid を文字列に変換します。クエリのパフォーマンスは通常の文字列列と同じですが、レコードをテーブルに挿入するのに少し時間がかかります。
  3. これがデータ ソースに適用される唯一のフィルターではない場合、データが既にメモリ内にあるときに、GUID LIKE 操作を適用できる可能性があります。

それが役に立てば幸い。

于 2013-01-02T09:10:34.957 に答える
2

データベース内の 'like' 句を処理するストアド プロシージャをデータベース内に作成し、プロシージャの結果を edmx からエンティティにマッピングすることで、この問題を回避しました。したがって、私のストアドプロシージャは次のとおりです。

CREATE PROCEDURE [dbo].[spGetDevicesWhereGuidContains] 
@partialGuidString as varchar (5)

AS
BEGIN
    SET NOCOUNT ON;
    SELECT * from devices where [Guid] like '%' + @partialGuidString + '%'
END

次に、モデル ブラウザーからエンティティに proc をマッピングします

そこからは明らかです。

List<Device> devices = context.spGetDevicesWhereGuidContains("8").ToList();

理想的ではありませんが、仕事はします。

于 2013-03-11T01:19:33.283 に答える