2012-04-21 25 views
9

Xét đoạn mã sauDịch queryable <T> trở lại IMongoQuery

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

Truy vấn thực tế là rất phức tạp và tôi không thích xây dựng nó bằng cách sử QueryBuilder thay vì LINQ.

Vì vậy, tôi muốn chuyển nó trở lại IMongoQuery để sử dụng trong cuộc gọi myCollection.Group() vì không có hỗ trợ GroupBy thông qua LINQ.

Có thể không?

Trả lời

18

câu trả lời được sửa đổi:

tôi nhận ra rằng đã có một cách chính thức để có được những truy vấn Mongo từ một truy vấn LINQ (Tôi đáng lẽ phải biết!). Bạn phải downCast IQueryable < T> để một MongoQueryable < T> để được tiếp cận với phương pháp GetMongoQuery:

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

Original câu trả lời:

Tại thời điểm này không hỗ trợ chính thức cách để làm điều đó , nhưng trong tương lai gần, chúng tôi dự định sẽ giúp bạn dễ dàng tìm ra truy vấn MongoDB truy vấn LINQ đã được ánh xạ tới.

Trong ngắn hạn, bạn có thể sử dụng phương pháp nội bộ không có giấy tờ sau đây để tìm hiểu những gì MongoDB truy vấn các truy vấn LINQ được ánh xạ tới:

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

Nhưng tại một số điểm bạn có thể cần phải chuyển đổi từ các phương pháp này không có giấy tờ để các phương thức được hỗ trợ chính thức (các phương pháp không có giấy tờ có thể thay đổi hoặc được đổi tên trong tương lai).

+0

này buồn bã ném đi tất cả các cuộc gọi orderby vào báo cáo kết LINQ gốc. Bạn phải áp dụng chúng trở lại kiểu Mongo. – Nashenas

0

Một phần mở rộng nhanh chóng dựa trên câu trả lời Robert Stam:

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()); 
} 

dụ:

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); 
Các vấn đề liên quan