gpt4 book ai didi

c# - 使用 C# LINQ 和 MongoDB 对嵌入/嵌套文档进行子查询或联接

转载 作者:行者123 更新时间:2023-12-04 11:23:51 24 4
gpt4 key购买 nike

我正在尝试做类似波纹管示例的事情,但出现异常 -
System.ArgumentException:“System.Collections.Generic.IEnumerable”类型的表达式 1 ' cannot be used for parameter of type 'System.Linq.IQueryable 1' 的方法。
这是我的代码和相关类。我该如何解决这个问题,除了尝试做之外,还有什么方法可以解决。

    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 支持仅限于相等连接,如 here 所述.您的表达式无法翻译成聚合框架的 $lookup因为 .Contains() 没有等效的语法.

因此,您必须运行更接近聚合框架语法的操作。一个例子是流畅的聚合接口(interface),它允许您运行与聚合框架的运算符同名的扩展方法。尝试:

var q = _channels.Aggregate()
.Unwind(x => x.Episodes)
.Lookup(
foreignCollectionName:"tracks",
localField:"Episodes.Tracks",
foreignField:"_id",
@as:"Tracks");

var result = q.ToList();

上面的代码将返回 List<BsonDocument>

关于c# - 使用 C# LINQ 和 MongoDB 对嵌入/嵌套文档进行子查询或联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60594737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com