c# - 使用 C# 和 fluent 库动态构建 Mongo Query
问题描述
我正在尝试建立一个 mongo 查询,我几乎让它在 Linq 中工作(那里有 95%),但看起来 Linq 提供程序中有一个不幸的缺失能力来做相当于一个 Intersect(coll).Any () 或用 Mongo 的说法 AnyIn()
我知道,如果我将流利的库与一些构建器一起使用,我可以构建一个过滤器,它会给我一个 AnyIn() - 但我缺少的是如何构建整个查询、初始过滤器、聚合、投影和最后的过滤器?
这是我的 Linq 查询的非常接近的近似值 - 只要我不尝试比较过滤器中的集合成员资格,它就可以完全按照要求工作
public List<MyResult> ListMyResults(Expression<Func<MyResult, bool>> filter, int skip, int take)
{
// Limit to tennants on main Entity being queried
var ents = ApplyDataRestrictions(db.GetCollection<Entity>("entities").AsQueryAble());
var children = db.GetCollection<Child>("children").AsQueryable();
var chickens = db.GetCollection<Chicken>("chickens").AsQueryable();
// Join a couple collections for their counts
var result = from ent in ents
join c in children on ent.Id equals c.EntityId into kids
join ck in chickens on ent.Id equals ck.EntityId into birds
// Project the results into a MyResult
select new MyResult
{
Id = ent.Id,
AProperty = ent.AProperty,
SomeCollection = ent.SomeCollection,
SomeOtherCollectionTagsMaybe = ent.SomeOtherCollectionTagsMaybe,
TotalKids = kids.Count(),
TotalChickens = birds.Count()
};
if(filter != null)
{
// Apply the filter that was built up from criteria on the MyResults data shape
result = result.Where(filter);
}
result = result.Skip(skip).Take(take);
return result.ToList()
}
public IQueryable<Entity> ApplyDataRestrictions(IQueryable<Entity> query)
{
... restrict results to only those with my tennant id ...
}
解决方案
实际上,没有 Query Builder 和AnyIn
. 具有IQueryable
接口,您可以尝试.Any()
将其Contains()
用作内部谓词
var inMemoryList = new List<int>() { 3, 4, 5 };
var q = from doc in Col.AsQueryable()
where doc.Collection.Any(x => inMemoryList.Contains(x))
select doc;
或者
var q2 = Col.AsQueryable().Where(x => x.Collection.Any(y => inMemoryList.Contains(y)));
推荐阅读
- python - 如何修复,TypeError: 不支持的操作数类型为 %: 'NoneType' 和 'int'
- python - KeyError 值问题
- angular - 有没有办法从两个可能的@Inputs 中设置一个变量?(角2+)
- android - 以编程方式更改线性布局背景颜色的问题
- java - Java - 扫描仪不读取带空格的字符串(已解决)
- angular - 在具有反应式表单的 Angular 7 应用程序中,我如何修改此方法以使其仅清除表单组中的无效表单控件?
- css - 根据 body 标签类/属性在组件中应用不同的样式
- python - 如何用机械化捕捉超时
- sql - 在列中查找日期的准确性并将其复制并根据日期值的准确性分配给日期列
- sql-server - 数据库 B 和 C 中表中的所有行,只有数据库 A 中表中的唯一行