gpt4 book ai didi

c# - C# 中的 MongoDb "AnyIn"过滤方法给出编译器错误

转载 作者:行者123 更新时间:2023-12-02 03:24:50 24 4
gpt4 key购买 nike

以下方法尝试使用“&”运算符在具有多个过滤器的 Mongo 集合中查找文档:

public MyEntity GetByUserRefsGuidDate(List<OrgReference> userRefs, string guid, DateTime date)
{
var userGuids = new List<String>();
foreach (var userRef in userRefs)
userGuids.Add(userRef.Guid);
var filterBuilder = Builders<MyEntity>.Filter;
var filter = filterBuilder.Eq(e => e.IsAnswered, true) &
filterBuilder.AnyIn(e => e.UserRef.Guid, userGuids) &
filterBuilder.Eq(e => e.Guid, guid) &
filterBuilder.Eq(e => e.Date, date);

}

AnyIn 过滤器方法给我以下错误:

Cannot convert lambda expression to type 'FilterDefinition<MyEntity>' 
because it is not a delegate type.

Guids 只是字符串值。我的实体类:

public class MyEntity
{

[BsonId]
[BsonIgnoreIfDefault]
public ObjectId MongoId { get; set; }

public string Title { get; set; }

public string Guid { get; set; }

public List<Category> Categories { get; set; }

public OrgReference UserRef { get; set; }

public bool IsAnswered { get; set; }

[BsonDateTimeOptions(Kind = DateTimeKind.Utc)]
public DateTime Date { get; set; }

}

我该如何解决?

最佳答案

MongoDB 驱动程序中的

AnyIn 方法具有以下签名(考虑表达式版本):

public FilterDefinition<TDocument> AnyIn<TItem>(Expression<Func<TDocument, IEnumerable<TItem>>> field, IEnumerable<TItem> values);

这意味着它可用于将数据库文档中的嵌套数组与您的内存集合进行匹配。

根据提供的 SurveyEntity 类,UserRef.Guid 似乎是单个值而不是集合(数组),因此您应该使用 In具有以下签名:

public FilterDefinition<TDocument> In<TField>(Expression<Func<TDocument, TField>> field, IEnumerable<TField> values);

因此它将数据库文档中的单个值与内存中的集合进行匹配。尝试:

var filter = filterBuilder.Eq(e => e.IsAnswered, true) &
filterBuilder.In(e => e.UserRef.Guid, userGuids) &
filterBuilder.Eq(e => e.Guid, guid) &
filterBuilder.Eq(e => e.Date, date);

这可能会造成混淆,因为 AnyInIn 在 MongoDB 查询语言中都会被翻译成 $in 但因为 C# 是强类型的他们必须为集合引入单独的方法。

关于c# - C# 中的 MongoDb "AnyIn"过滤方法给出编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53685166/

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