c# - 使用 C# LINQ 和 MongoDB 对嵌入式/嵌套文档进行子查询或联接
问题描述
我正在尝试执行类似于下面示例的操作,但将异常作为 - System.ArgumentException: Expression of type 'System.Collections.Generic.IEnumerable 1 ' cannot be used for parameter of type 'System.Linq.IQueryable
1' of method。这是我的代码和相关类。我该如何解决这个问题,除了尝试做之外还有什么办法。
var channels = _channelService.Collection;
var tracks = _trackService.Collection;
var query = from b in tracks.AsQueryable()
select b;
var data = (from q in channels.AsQueryable()
from p in q.Episodes
//from x in trackcoll.AsQueryable()
select new
{
p,
Tracks = query.Where(w => p.Tracks.Contains(w.Id))
}).ToList();
// Related classes
public class ContentBase : IAuditable
{
public string Id { get; set ; }
public string CreatedBy { get ; set ; }
public string CreatedOn { get ; set ; }
public string UpdatedBy { get ; set ; }
public string UpdatedOn { get; set; }
}
public class Channel: ContentBase
{
public List<Episode> Episodes { get; set; }
}
public class Episode: ContentBase
{
// List of track Id
public List<string> Tracks { get; set; }
}
public class Track: ContentBase
{
public string TrackUrl { get; set; }
public string Duration { get; set; }
public string Size { get; set; }
public string ContentType { get; set;
}
解决方案
MongoDB 对连接的 LINQ 支持仅限于此处描述的相等连接。您的表达式无法转换为聚合框架的$lookup,因为.Contains()
.
因此,您必须运行更接近聚合框架语法的操作。一个例子是一个流畅的聚合接口,它允许你运行与聚合框架的操作符同名的扩展方法。尝试:
var q = _channels.Aggregate()
.Unwind(x => x.Episodes)
.Lookup(
foreignCollectionName:"tracks",
localField:"Episodes.Tracks",
foreignField:"_id",
@as:"Tracks");
var result = q.ToList();
上面的代码将返回一个List<BsonDocument>
推荐阅读
- apache-nifi - Nifi将记录中的所有字段都映射到[表名]定义的列
- mysql - NodeJS/mysql2 中的重叠
- angular - 角度通用,NestJs TTFB 加载时间超过 5 秒
- c# - 显示 System.Collections.Generic.List 不起作用
- serilog - 通过 Json 配置覆盖 Serilog 接收器
- angular - 将值传递给 Angular 中的 Injectable 扩展类
- react-native - react-native run-android 命令失败
- light-4j - 在 light-4j 应用程序的访问日志中打印查询参数?
- java - ForkJoinPool 结果从未到达
- matlab - 有没有办法在嵌套函数中声明局部变量?