복붙노트

[MONGODB] Queryable에서 <T> 다시 IMongoQuery 번역

MONGODB

Queryable에서 다시 IMongoQuery 번역

다음 코드를 고려

var q = from e in myCollection.AsQueryable<Entity>() where e.Name == "test" select e;

실제 쿼리는 매우 복잡하고 내가 대신 LINQ의 QueryBuilder를 사용하여 구축 좋아하지 않는다.

내가) (myCollection.Group에서 사용하기에 다시 IMongoQuery에 전화를 변환 할 수 있도록 LINQ를 통해 더 GROUPBY 지원이 없기 때문이다.

그것은 수 있습니까?

해결법

  1. ==============================

    1.편집 대답 :

    편집 대답 :

    나는 이미 LINQ 쿼리에서 몽고 쿼리 얻을 수있는 공식적인 방법이 있다는 것을 깨달았다 (내가 알았어 야를!). 당신은 다운 캐스트해야하는 된 IQueryable 에 MongoQueryable 를 GetMongoQuery 방법에 대한 액세스 권한을 얻을 수 있습니다 :

    var linqQuery = from e in collection.AsQueryable<Entity>() where e.Name == "test" select e;
    var mongoQuery = ((MongoQueryable<Entity>)linqQuery).GetMongoQuery();
    

    원래 답 :

    이 순간에는 공식적으로 그렇게 할 수있는 방법이 지원되지 않지만 가까운 미래에 우리는 MongoDB의 쿼리 LINQ 쿼리가 매핑 된 무엇인지 쉽게 찾을 수 그것을 만들 예정 않습니다.

    단기적으로 당신은 LINQ 쿼리가 매핑되는 쿼리 무엇 MongoDB를을 찾으려면 다음 문서화되지 않은 내부 방법을 사용할 수 있습니다 :

    var linqQuery = from e in collection.AsQueryable<Entity>() where e.Name == "test" select e;
    var translatedQuery = (SelectQuery)MongoQueryTranslator.Translate(linqQuery);
    var mongoQuery = translatedQuery.BuildQuery();
    

    그러나 어느 시점에서 당신은 (문서화되지 않은 방법이 변경 될 수 있습니다 또는 미래에 이름을 바꿀 수) 공식적으로 지원 방법에 이러한 문서화되지 않은 방법으로 전환해야 할 수도 있습니다.

  2. ==============================

    2.로버트 스탐의 답변에 따라 빠른 확장 :

    로버트 스탐의 답변에 따라 빠른 확장 :

    public static IMongoQuery ToMongoQuery<T>(this IQueryable<T> linqQuery)
    {
        var mongoQuery = ((MongoQueryable<T>)linqQuery).GetMongoQuery();
        return mongoQuery;
    }
    public static WriteConcernResult Delete<T>(this MongoCollection<T> col,   IQueryable<T> linqQuery)
    {
         return col.Remove(linqQuery.ToMongoQuery());
    }
    public static WriteConcernResult Delete<T>(this MongoCollection<T> col, Expression<System.Func<T, bool>> predicate)
    {
        return col.Remove(col.AsQueryable<T>().Where(predicate).ToMongoQuery());
    }
    

    예:

    myCollection.Remove(myCollection.AsQueryable().Where(x => x.Id == id).ToMongoQuery());
    myCollection.Delete(myCollection.AsQueryable().Where(x => x.Id == id));
    myCollection.Delete(x => x.Id == id);
    
  3. from https://stackoverflow.com/questions/10261156/translate-queryablet-back-to-imongoquery by cc-by-sa and MIT license