1

我的SQL DB中有許多表存儲基本KVP數據。它們都具有Id(int),Description(varchar(..))的模式。如何在匿名方法中將DBSet轉換爲接口 - E.F

我需要他們在我的MVC應用程序的一個階段或另一個階段,我試圖創建一個匿名方法,將採取實體類的類型並返回該項目數據的列表。我希望能夠在我的數據庫中的任意數量的表中使用此方法,而不必延長我寫的方法太多。

實施例的數據:

  • ID:1,詳細描述:紅
  • ID:2,詳細描述:藍
  • ID:3,詳細描述:綠

的ISet實施:

public interface ISet 
{ 
    int Id { get; set; } 
    string Description { get; set; } 
} 

可能的方法實現

public static IList<T> BuildSet<T>() 
{ 
    using (var db = new somethingEntities()) 
     return db.Set(typeof(T)).Cast<ISet>().Select(c => new { c.Id, c.Description }).ToList(); 
} 

使用

var data = BuildSet<YourType>(); 

運行時錯誤

Cannot create a DbSet<ISet> from a non-generic DbSet for objects of type 'YourType'. 

有誰知道該怎麼辦 這個?

謝謝。

回答

0

我假設DbSet的是小ToList()將一次性提取所有結果?

然而,這裏是你的代碼的簡化版本(你指定的泛型類型約束接口ISet):

public static IList<ISet> BuildSet<T>() 
    where T : class, ISet 
{ 
    using (var db = new somethingEntities()) 
     return db.Set<T>().ToList(); 
} 

也有擴展方法爲你的DbContext的選項:

public IEnumerable<ISet> BuildSet<T>(this DbContext context) 
    where T : class, ISet 
{ 
    return context.Set<T>().AsEnumerable(); 
} 

然後,您可以在上下文的生命週期內使用它,從而實現更高效的操作。 (我知道我假設太多了,但無論如何我覺得它是有用的信息。)

public void SomeOperation() 
{ 
    using (var db = new somethingEntities()) 
    { 
     foreach (var item in db.BuildSet<SimpleSet>()) 
     { 
      //do something with item 
      //SaveChanges() every 100 rows or whatever 
     } 
    } 
} 
0

問題已解決。

方法聲明

public static List<ISet> BuildSet<T>() where T : class 
{ 
    using (var db = new somethingEntities()) 
     return db.Set<T>().ToList().Cast<ISet>().ToList(); 
} 

使用

var data = ...BuildSet<YourType>();