0

プロパティの 1 つとして int 配列を持つクラスがあるとします。

public MyClass
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int[] Values { get; set; }
}

エンティティ フレームワークを使用してデータベースに保存します。私が気付いたのは、EF が Values プロパティを varchar(max) に変換することです。

ここで、データベースにクエリを実行し、指定された int パラメータを含む 'Values' のレコードを返します。

public List<MyClass> Search(int valueToSearch)
{
    return context.MyClasses.Where(x => x.Values.Contains(valueToSearch)).ToList();
}

ただし、これにより、linq-to-sql が contains コマンドをサポートしていないという例外がスローされます。

私も試しWhere(x => x.Values.Any(y => y == valueToSearch))ましたが、同じ例外がスローされます。

EFが配列をvarcharに変換するため、containsステートメントなどを使用できないという事実と関係があると思います。値の別のテーブルで問題が解決するかもしれませんが、整数プロパティが 1 つしかないクラスを作成するのはちょっとばかげているように見えますか?

これを解決するより良い方法はありますか?

反対のこと (SQL IN ステートメント) を行っている例をたくさん見つけましたが、それは私たちが探しているものではありません。パラメータとして整数は 1 つしかありませんが、エンティティには複数の整数があります。

.NET 4.0 で EF5 を使用しています。

ありがとう!

編集

varchar は、自分で作成した文字列のようです。自分で書いたわけではないコードだったので、気がつきませんでした。もちろん、その文字列は varchar に変換されます。

ここで、質問は「プリミティブ型の配列を格納する最良の方法は何ですか?」のようなものに変わります。そして、その質問はSOですでに何度も回答されています(そのうちの1つはコメントで提供されています)。

4

1 に答える 1

1

linq の外でエンティティにクエリを実行します: (すべての行を取得する必要があります)

public List<MyClass> Search(int valueToSearch)
{
    var c = context.MyClasses.ToList(); // cache
    return c.Where(x => x.Values.Contains(valueToSearch));
}

編集:現在、整数の配列を文字列に手動で変換している場合は、クラス プロパティを整数の配列から文字列に変更します。

ただし、新しいテーブルをお勧めします。db フィールドの文字列としての整数の配列は、少し匂いがします。

于 2013-09-25T13:52:41.517 に答える