2

LinqtoEntitiesとEntityFrameworkを使用してクエリを作成しています。私のアプリは2つのデータベースを使用しています。クライアントの要求により、クロスデータベースはオプションではありません。

たとえば、最初のデータベースに存在し(つまり、1つのEFモデルにあり)、複合キーを持つMyEntity2番目のデータベース(つまり、別のEFモデルにある)のエンティティを参照しているとします。ここで、一連の(この例では、キー[1、1]、[1、2]、および[1、3]を持つエンティティ)を参照するSecondDBEntityすべてを取得したいとします。MyEntitySecondDBEntity

生成したいSQLは次のとおりです。

SELECT *
  FROM MyEntity
 WHERE (MyEntity.ForeignKeyOne = 1 AND MyEntity.ForeignKeyTwo = 1)
    OR (MyEntity.ForeignKeyOne = 1 AND MyEntity.ForeignKeyTwo = 2)
    OR (MyEntity.ForeignKeyOne = 1 AND MyEntity.ForeignKeyTwo = 3)

次に、次のコードを試しました。

var setOfEntitiesToSearch = LetsAssumeThisIsAnIEnumerableOfSecondDBEntity;
return (from myEntity in DataContext.MyEntityList
       where setOfEntitiesToSearch.Any(entityToSearch => entityToSearch.KeyOne == myEntity.ForeignKeyOne && entityToSearch.KeyTwo == myEntity.ForeignKeyTwo)
      select myEntity).ToList();

このコードは正常にコンパイルされますが、実行するとエラーが発生します。

"Unable to create a constant value of type 'SecondDBEntity'. Only primitive types or enumeration types are supported in this context."

私の主な問題は、エンティティが異なるデータベースにあるためです。これは私が構築しようとしているかなり一般的なクエリであるため、私はおそらく何かばかげたことをしています。そのため、このクエリを作成できるEFの機能が不足していると思います。多分いくつかのCompositeKey構造?または、それらのEFモデルを混合する方法はありますか?

前もって感謝します。

4

2 に答える 2

0

最初に2つのリストを作成します

var listKeyOne = setOfEntitiesToSearch.Select(e => e.KeyOne);
var listKeyTwo = setOfEntitiesToSearch.Select(e => e.KeyTwo);

次に、次のようなリストを使用します

return (from myEntity in DataContext.MyEntityList
       where listKeyOne.Any(keyOne => myEntity.ForeignKeyOne == keyOne) &&
             listKeyTwo.Any(keyTwo => myEntity.ForeignKeyTwo == keyTwo)
      select myEntity).ToList();

これにより、問題はより簡単になります。それがうまくいくかどうか私に知らせてください

于 2012-10-06T22:19:03.963 に答える
0

Linqは、setOfEntitiesToSearchをSQLクエリに変換できません。プリミティブタイプのみを使用できます。IEnumerableは列挙型と同じではないことに注意してください。Linqは、整数型の値に変換できるため列挙型を使用できますが、IEnumerableをプリミティブ型に変換することはできません。

私が考えることができることから、あなたはこの2つの異なる方法について行くことができます。(このコードはコンパイルせずに入力しているため、デバッグが必要な場合があります。)

1)setOfEntitiesToSearchをループして、次のようなリストを作成します。

List<MyEntity> results = new List<MyEntity>();
foreach (item in setOfEntitiesToSearch) {
    results.AddRange(
        from myEntity in DataContext.MyEntityList           
        where myEntity.ForeignKeyOne == item.KeyOne && myEntity.ForeignKeyTwo == item.KeyTwo
        select myEntity).ToList()
    );
}
return results;

2)すべてのDataContext.MyEntityListをメモリ内リストに取得し、クエリします。

var entityList = DataContext.MyEntityList.ToList()
return entityList.Where(myEntity => setOfEntitiesToSearch.Any(entityToSearch => entityToSearch.KeyOne == myEntity.ForeignKeyOne && entityToSearch.KeyTwo == myEntity.ForeignKeyTwo)).ToList()

#1への欠点-ループでdbを呼び出す。

#2の欠点-DataContext.MyEntityListが返すアイテムの数によっては、entityListが非常に大きくなる場合があります。

于 2012-10-06T22:27:58.090 に答える