3

次のクラスがあります。

public class Company
{
   [BsonId]
   public string dealerId = null;

   public List<Dealer> dealers = new List<Dealer>();
}

public class Dealer
{        
   public string dId = null;          
   public int dIndex = -1;

   public List<AutoStore> stores = new List<AutoStore>();
}

public class AutoStore
{
   public string type = null; 
   public  Dictionary<string, object> data = new Dictionary<string, object>();
}

Companyクラス オブジェクトを Mongoに保存することができますInsert()。問題は、ドキュメントを検索し、そのList<>項目で LINQ を使用しようとしたときです。私は常に例外を取得します。

var query =  collection.AsQueryable<Company>()
                 .Where(cpy =>
                     cpy.dealers.Where(dlr => 
                         dlr.stores.Count == 1).Count() > 0) ;

このコードを実行すると、次のようになります。

System.NotSupportedException: 式のシリアル化情報を特定できません: Enumerable.Count

LINQ今日Mongoを使い始めたばかりですが、サポートはもっと成熟していると思いました。C#and で行ったように、ネストされた配列クエリを実行できるかどうか誰か教えてもらえますLINQか?

Where()のいずれかを削除するとすぐにList<>、その例外はスローされません

4

2 に答える 2

4

あなたの例外によると、問題の領域はWhereステートメントを実行している場所にあります。

私のコメントで言ったように。やってみてください:

var v = collection.AsQueryable<Company>().Where(cpy => cpy.Dealers.Any(dlr => dlr.Stores.Count == 1));

あなたは現在次のようなことをしています:

var dealers = collection.AsQueryable<Company>().Select(cpy => cpy.Dealers);
var dealersWithStores = dealers.Where(dealer => dealer.Stores.Count == 1);

次に、anycount を呼び出して店舗を持つディーラーがあるかどうかを確認し、それが 0 より大きいかどうかを確認boolして、どこにいるのかを調べます。これらはすべて を呼び出すのと同じIEnumerable.Any()です。これが機能するかどうかを確認しますか?:)

于 2013-01-31T09:33:29.620 に答える
3

次のようにクエリをより効率的に書くことができます

var query =  collection.AsQueryable<Company>()
                 .Where(c => c.dealers.Any(d => d.stores.Count == 1);

Mongo querty プロバイダーがサポートIListに苦労している場合は、

var query =  collection.AsQueryable<Company>()
                 .Where(c => c.dealers.Any(d => d.stores.Count() == 1);

より良く機能します。そうであれば、MongoDB クエリ プロバイダーの成熟度に関するレポートは誇張されています。

于 2013-01-31T09:41:39.347 に答える