Tôi sử dụng ((ObjectQuery)IQueryable).ToTraceString()
để lấy và tinh chỉnh mã SQL sẽ được thực thi bởi LINQ.Cách lấy ToTraceString cho IQueryable.Count
Vấn đề của tôi là không giống như hầu hết các phương pháp IQueryable IQueryable.Count như đã định nghĩa như thế này:
public static int Count(this IQueryable source) {
return (int)source.Provider.Execute(
Expression.Call(
typeof(Queryable), "Count",
new Type[] { source.ElementType }, source.Expression));
}
thực hiện truy vấn mà không soạn thảo và gửi lại IQueryable. tôi muốn làm các việc lừa bởi một cái gì đó như thế này:
public static IQueryable CountCompile(this IQueryable source) {
return source.Provider.CreateQuery(
Expression.Call(
typeof(Queryable), "Count",
new Type[] { source.ElementType }, source.Expression));
}
Nhưng sau đó CreateQuery mang lại cho tôi những ngoại lệ sau đây:
LINQ to Entities query expressions can only be constructed from instances that implement the IQueryable interface.
Tuyệt vời, bạn có biết làm thế nào để đạt được cùng trên DBContext, mà không cần sử dụng ObjectContext của nó? Khi tôi cố gắng sử dụng cách tiếp cận tương tự - nó ném ngoại lệ - Không thể tạo thể hiện {Entity tôi muốn đếm}, truy vấn chỉ có thể sử dụng các giá trị nguyên thủy –
@PhilippMunin Khi tôi thử điều này trong một dự án sử dụng DbContext, nó hoạt động tốt. Bạn có thể bao gồm một số chi tiết khác cho biết cách làm cho nó thất bại không? (Dự án của tôi đang sử dụng một bản xây dựng EF6 khá gần đây nhưng vẫn còn tiền phát hành, nếu nó quan trọng.) – hvd
Tôi đã tạo ra câu hỏi riêng cho điều đó: http://stackoverflow.com/questions/19385346/dbcontext-get-iqueryable-for- scalar-system-functions-count-any-sum-max Sẽ thực sự đánh giá cao nếu bạn tìm cách để làm điều đó –