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

我今天刚开始使用Mongo,但我认为LINQ支持更成熟。谁能告诉我是否可以像使用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);

any然后,您通过调用 count 并检查是否大于 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 查询提供者难以支持IList,您可能会发现

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

效果更好。如果是这样,那么有关 MongoDB 查询提供程序成熟度的报告就被夸大了。

于 2013-01-31T09:41:39.347 回答