2009-07-27 20 views
8

Tôi đang tìm kiếm một tương đương với DataContext.GetTable<TEntity> trong Khuôn khổ thực thể. Tôi đã tìm thấy phương thức ObjectContext.CreateQuery<T> nhưng khác với DataContext.GetTable<TEntity> vì nó cần chuỗi truy vấn hoạt động.Khung thực thể có tương đương với DataContext.GetTable <TEntity> từ Linq2Sql (ObjectContext.CreateQuery <T>?)

Có cách nào để lấy đối tượng IQueryable cho bảng sử dụng loại thực thể mà không chỉ định chuỗi truy vấn không?

*EDIT: Added code snippet*
Đây là đoạn trích của lớp Repository mà tôi đã triển khai thực hiện với linq2sql. Tôi không thể sử dụng ObjectContext.[TableName] vì nó sẽ không còn chung chung nữa.

public class BaseRepository<TClass> : IDisposable 
     where TClass : class 
    { 
     protected BaseRepository(DataContext database) 
     { 
      _database = database; 
     } 
     ... 

     public IQueryable<TClass> GetAllEntities() 
     { 
      IQueryable<TClass> entities = _database.GetTable<TClass>(); 
      return entities; 
     } 

     public IQueryable<TClass> GetEntities(Expression<Func<TClass, bool>> condition) 
     { 
      IQueryable<TClass> table = _database.GetTable<TClass>(); 
      return table.Where(condition);  
     } 

*EDIT: Added my solution (so far..)*
Đây là những gì tôi đang sử dụng:

public IQueryable<TClass> GetEntities(Expression<Func<TClass, bool>> condition) 
{ 
    IQueryable<TClass> table = _database.CreateQuery<TClass>(typeof(TClass).Name); 
    return table.Where(condition);  
} 

này hoạt động miễn là tên lớp là như nhau trong những tên bảng. Điều này sẽ trở thành một vấn đề đối với tôi khi tôi bắt đầu sử dụng các đối tượng khác nhau cho cùng một bảng.

Tôi hy vọng tôi đã rõ ràng, cảm ơn trước,
Marco :)

+0

Marco B, bạn đã tìm thấy một giải pháp? Tôi có cùng một vấn đề và thậm chí đi qua "[EntitySet]" như tham số để CreateQuery tôi không thể làm cho nó hoạt động. –

+2

Tôi đã tìm thấy câu trả lời này trước tiên và [câu trả lời này] (http://stackoverflow.com/questions/7263083/gettable-equivalent-for-objectcontext) sau đó. Có vẻ như câu trả lời thứ hai có một cách dễ dàng hơn để làm điều này giống như 'GetTable' từ Linq2SQL –

Trả lời

6

Thực ra, chính nhà thiết kế EF sử dụng CreateQuery với các chuỗi được mã hóa cứng cho các tham chiếu tĩnh. Nếu bạn đào sâu vào tệp thiết kế, bạn sẽ thấy một cái gì đó như thế này:

public global::System.Data.Objects.ObjectQuery<Customers> Customers 
{ 
    get 
    { 
     if ((this._Customers == null)) 
     { 
      this._Customers = base.CreateQuery<Customers>("[Customers]"); 
     } 
     return this._Customers; 
    } 
} 

private global::System.Data.Objects.ObjectQuery<Customers> _Customers; 

Về mặt kỹ thuật không có giải pháp hoàn hảo vì bạn có thể sử dụng cùng loại thực thể cho các bộ thực thể khác nhau. Nhưng bạn có thể cung cấp cho nó thử đại học cũ:

public IQueryable<TEntity> GetEntities<TEntity>() 
{ 
    Type t = typeof(TEntity); 
    var edmAttr = (EdmEntityTypeAttribute)Attribute.GetCustomAttribute(t, 
     typeof(EdmEntityTypeAttribute), false); 
    if (edmAttr == null) // Fall back to the naive way 
    { 
     return context.CreateQuery<TEntity>(t.Name); 
    } 
    var ec = context.MetadataWorkspace.GetEntityContainer(
     context.DefaultContainerName, DataSpace.CSpace); 
    var entityType = context.MetadataWorkspace.GetType(edmAttr.Name, 
     edmAttr.NamespaceName, DataSpace.CSpace); 
    var es = ec.BaseEntitySets.First(es => es.ElementType == entityType); 
    return context.CreateQuery<TEntity>(es.Name); 
} 
+0

Cảm ơn nó hoạt động tốt! Tình cờ hôm nay tôi đã tìm thấy một giải pháp tương tự trong dự án kigg trên codeplex (http://kigg.codeplex.com). – marcob

+0

Cố gắng sử dụng mã này, nhưng vấn đề là BaseEntitySets.First không phải là IQueryable, vì vậy tôi không thấy làm thế nào những người khác có ví dụ này làm việc. –

+0

Tôi nghĩ câu hỏi này cần cập nhật. Có vẻ như người hỏi Câu hỏi đã chấp nhận một câu trả lời rằng anh ta chỉ sử dụng một phần, vì vậy câu trả lời là khó hiểu.Trong thực tế, Người hỏi chỉ sử dụng 'return context.CreateQuery (t.Name);' mã mà tôi không chú ý và dành một vài giờ cố gắng để có được Câu trả lời được chấp nhận làm việc. Ngay sau khi tôi chuyển sang sử dụng phương pháp CreateQuery CHỈ nó hoạt động hoàn hảo. –

0

Tôi hy vọng tôi không bị mất điểm, nhưng nó sẽ không được:

ObjectContext.TableName 

đâu TableName là EntitySet của kiểu bạn muốn làm việc.

+0

Xin chào, tôi không muốn sử dụng tên bảng vì tôi muốn có một cách chung để truy cập vào bảng. Tôi đã thêm đoạn mã từ lớp học của mình để giải thích rõ hơn những gì tôi muốn đạt được. Giải pháp duy nhất tôi có thể tưởng tượng ngay bây giờ là sử dụng phương pháp ObjectContext.CreateQuery thay đổi một chút cấu trúc của lớp chung của tôi đi qua đến hàm tạo cũng là TableName. – marcob

1
public IQueryable GetTable<T>(T entity) where T : class 
{ 
    return context.CreateObjectSet<T>(); 
} 
Các vấn đề liên quan