2015-11-18 11 views
7

Tôi hiện đang tạo một ứng dụng trong C# 4.0 với EntityFramework 6.0.Trường hợp khoản không được bao gồm trong truy vấn SQL

Tôi đang cố truy xuất danh sách mục từ cơ sở dữ liệu nhưng vấn đề là truy vấn SQL được tạo bởi khung công tác EF không bao gồm mệnh đề where.

Vì vậy, toàn bộ bảng/lượt xem được tải trong bộ nhớ và mất khoảng 10 giây để chỉ nhận được 2 hoặc 3 mục.

Dưới đây, các phương pháp từ GenericRepostitory tôi:

public IList<TEntity> GetList(Func<TEntity, bool> where, params Expression<Func<TEntity, object>>[] navigationProperties) 
{ 
    using (var dbContextScope = contextScopeFactory.CreateReadOnly()) 
    { 
     IQueryable<TEntity> dbQuery = Context.Set<TEntity>().AsQueryable(); 

     foreach (Expression<Func<TEntity, object>> navigationProperty in navigationProperties) 
      dbQuery = dbQuery.Include<TEntity, object>(navigationProperty); 

     var list = dbQuery 
      .AsNoTracking() 
      .Where(where); 

     Context.Database.Log = s => Debug.WriteLine(s); 

     return list.ToList<TEntity>(); 
    } 
} 

Và tôi gọi nó là như thế này:

var repository = repositoryFactory.Get<Context, Entity>(); 
var items = repository.GetList(x => x.FakeID <= 10); 

Kết quả trả về là tốt nhưng phải mất khoảng 10 giây để được lấy ra. Và khi gỡ lỗi ghi truy vấn SQL được tạo, mệnh đề where là hư không

Làm cách nào tôi có thể sửa đổi hàm GetList để bao gồm mệnh đề where?

Tôi hy vọng tôi đã đủ thông tin với những thông tin này và tôi xin lỗi vì tiếng anh của tôi. Đó không phải là ngôn ngữ mẹ đẻ của tôi:/

Dù sao, cảm ơn bạn để được giúp đỡ của bạn

+1

'Context.Set () .AsQueryable(); 'là gì' Context' nếu không phải là một 'DbContext '? Không thể cần đến 'AsQueryable' ở đây. –

+0

Có, tôi không nên xóa nó. Đó là vì tôi đã bị mắc kẹt với vấn đề này kể từ một vài giờ và đã thử rất nhiều thứ khác nhau ... – Mica

Trả lời

7

Thay đổi phương pháp chữ ký của bạn từ

GetList(Func<TEntity, bool> where, ... 

để

GetList(Expression<Func<TEntity, bool>> where, ... 

Bạn vẫn có thể gọi nó với một lambda, giống như bạn làm bây giờ. Các Where được sử dụng như "linq-to-đối tượng", trên danh sách đầy đủ đã được đọc từ cơ sở dữ liệu. Với Expression EF có thể đọc để tạo sql cần thiết.

+0

Cảm ơn bạn, nó đang hoạt động! :) – Mica

7

Các loại tham số whereFunc<TEntity, bool>, vì vậy

dbQuery.Where(where) 

sử dụng phương pháp Enumerable.Where mở rộng, tải dữ liệu vào bộ nhớ trước khi lọc. Nếu bạn muốn sử dụng phương pháp Queryable.Where (mà sẽ được dịch sang SQL), bạn cần một tham số Expression<Func<TEntity, bool>>

public IList<TEntity> GetList(Expression<Func<TEntity, bool>> where, 
           params Expression<Func<TEntity, object>>[] navigationProperties) 
+0

Cảm ơn bạn và lời giải thích của bạn. Tôi hiểu rõ hơn sự khác biệt ngay bây giờ! :) – Mica

Các vấn đề liên quan