[英]Strongly typed Query not translated as expected
使用C#和mongo,我正在检查一些不同的查询方式。 目前,我有一系列旅行,每次旅行都有一系列费用。 每个体验都有其自己的objectId。
首先,我有此查询来查找要更新的特定查询。 诀窍是第二部分,我将自己的方式添加到费用ID中。
var Update = Query.And(
Query<Trip>.EQ(t => t.Id, ObjectId.Parse(tripId)),
Query<Expense>.EQ( "Expenses._id", ObjectId.Parse(id)));
当我在此处输入错误时,将其命名为Expenses._Id(以大写II表示)正在寻找一种摆脱“松散字符串”的方法。
我试过了
var tripToUpdate = Query.And(
Query<Trip>.EQ(t => t.Id, ObjectId.Parse(tripId)),
Query<Expense>.EQ(e => e.Id, ObjectId.Parse(id)));
但是它被翻译成
{ "$and" : [{ "_id" : ObjectId("5224f0208c74943810d333f6") },
{ "_id" : ObjectId("5224f0488c74943810d333f7") }] }
而不是预期的Expense._id
。 我想我需要某种约定才能对此提供支持。
不仅可以通过查询来以更强类型的方式编写代码吗?
对于查询,我已经在使用std C#提供程序。
是的, 类似的可能性是可能的,它不会创建相同的查询,但是对于给定的查询,这没有什么区别:
var query =
from c in collection.AsQueryable<Trip>()
where c.Id == trip.Id
where c.Expenses.Any(p => p.Id == myId)
select c;
要么
var query =
collection.FindAs<Trip>(
Query.And(
Query<Trip>.EQ(p => p.Id, trip.Id),
Query<Trip>.ElemMatch(p => p.Expenses, q => q.EQ(x => x.Id, myId))));
但是,请注意,两者都会创建一个$elemMatch
查询,如下所示:
{
"_id" : ObjectId("522512c5298f241198548b9d"),
"Expenses" : {
"$elemMatch" : {
"_id" : ObjectId("522512c5298f241198548b9b")
}
}
elemMatch
将检查数组中的单个元素是否符合所有条件。 在这种情况下,数组元素只有一个条件,那是一回事,但查询却不同。
根据@mnemosyn的回答,我提出了通过添加向下转换来改进此解决方案的方法。
输入大量信息后,我首先使用了ElemenMatch,但是在对stackoverflow进行了进一步搜索之后,我发现从IQueryable到MongoQueryable的下调,如此处所述
在此之后,代码将类似于:
var query =
.Trips.AsQueryable()
.Where(c => c.Id == ObjectId.Parse(tripId) && c.Expenses.Any(p => p.Id == ObjectId.Parse(id)));
随后向下转换为MongoQuery
var mongoQuery = ((MongoQueryable<Trip>) query).GetMongoQuery();
真的很棒。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.