我有以下课程:
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
将Insert()
类对象存储在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<>
后,就不会抛出该异常
答案 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查询提供程序成熟度的报告就会被夸大。