不能使用Linq与嵌套类List<>关于MongoDb C#

时间:2013-01-31 09:17:55

标签: c# linq mongodb

我有以下课程:

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>();
}

我可以使用CompanyInsert()类对象存储在Mongo中。问题是当我搜索文档并尝试在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#LINQ一样?

我删除任何Where()上的List<>后,就不会抛出该异常

2 个答案:

答案 0 :(得分: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经销商与商店,并检查是否大于0以使您的bool在哪里。所有这些都与调用IEnumerable.Any()相同。看看这是否有效? :)

答案 1 :(得分: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);

效果更好。如果是这样,MongoDBs查询提供程序成熟度的报告就会被夸大。