繁体   English   中英

强类型查询未按预期翻译

[英]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的下调,如此处所述

将Queryable <T>转换回IMongoQuery

在此之后,代码将类似于:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM