0

私には解決できない小さな問題があります。Linq で SQL-In-Statement を使用したいと考えています。私はこのフォーラムと他のフォーラムで、.Contains を使用する必要があることを読みました (逆の考え方の表記を使用:-))。入力として、Guid のリストがあります。最初にそれらを配列にコピーしてから、そのようなことをしました:

datatoget = (from p in objectContext.MyDataSet
             where ArrayToSearch.Contains(p.Subtable.Id.ToString())
             select p).ToList();

datatoget は、Subtable.Id (Guid) に一致するすべてのレコードを格納する必要がある結果です。Subtable は MyData の Detail-Table であり、Id は Guid-Type です。私はいくつかのことを試しました(GuidをStringに変換してから.Containsを使用するなど)が、常に次のような例外が発生します:

「Linq to Entities」はメソッド「Boolean Contains(System.Guid)」を認識せず、このメソッドをメモリ式に変換できません。(私はVS2008のドイツ語版を使用しているため、そのようなものです)

.NET 3.5 で L2E を使用しており、VS 2008 で C# でプログラミングしています。

いくつかの例を読みましたが、うまくいきません。おそらく、文字列の代わりに Guid を使用しているためでしょうか? また、独自の比較関数を作成しようとしましたが、.NET が比較のために関数を呼び出すように統合する方法がわかりません。

4

3 に答える 3

0

Any()でを使用できますarrayToSearchか?

 datatoget = objectContext
              .MyDataSet
              .Where(p => arrayToSearch.Any(i => i == p.Subtable.Id.ToString()) 
              .ToList();
于 2010-04-19T15:00:12.507 に答える
0

私の質問に時間を割いていただきありがとうございます。Robert Havery からのリンクが作成されました :) ご覧のとおり、.Contains() は、Linq for Entities と .NET3.5 では (うまく) 動作しません。拡張メソッドを書かずにそれを行う可能性はありません。LinqPad で少し試してみましたが、Linq 2 SQL を使用する場合、.Contains() で問題はありません。それは約束どおりに実行しました。そして、Linq to Entities では、私が常に例外を取得したことを除いて、約束はありませんでした (しかし、これは約束でもあります:))。

Robert Havery をはじめ、私を助けてくれたすべての人に感謝します。

于 2010-04-20T11:58:06.590 に答える
0

私はこれらの2つのアプローチを試します:

最初のアプローチ: 何も変換しないでください。これは、p.Subtable.Id がデータベースで GUID として定義されていることを前提としています。

Guid[] guids = GetGuids();

var dataToGet = (from p in objectContext.MyDataSet
                 where guids.Contains(p.Subtable.Id)
                 select p).ToList();

2 番目のアプローチ: 最初にすべての GUID を文字列に変換します。

string[] guids = GetGuids().Select(g => g.ToString()).ToArray();

var dataToGet = (from p in objectContext.MyDataSet
                 where guids.Contains(p.Subtable.Id.ToString())
                 select p).ToList();

これらのアプローチのいずれも機能しない場合は、データベースのスキーマ、エンティティの形状など、問題に関する詳細情報を確認する必要があります。

于 2010-04-19T15:17:03.277 に答える