2016-12-09 24 views
1

我想實現一個通用的存儲庫模式,在IEnumerable中實現通用項目的CRUD操作。我遇到了一般性查找可能已經在IEnumerable中的項目的問題。我需要以編程方式傳遞哪些屬性組成'key'或不同的記錄,然後使用LINQ對定義的屬性執行Enumerable.Any(),以便它可以查看對象是否已經存在於IEnumberable中。這是我的代碼到目前爲止。一般找到項目屬性值相等的任何項目使用LINQ

//Generic Method 
    public void AddItem(TEntity item) 
    { 
     var entities = GetAllItems().ToList(); //Method gets cached IEnumerable<TEntity> 

     if(true)//Generically see if TEntity is already in the list based of defined properties 
     { 
      entities.Add(item); 
     } 

    } 

    //Same function but non-generic 
    private void AddItem(MyObject object) 
    { 
     var objects = GetAllItems().ToList(); //Method gets cached IEnumerable<MyObject> 

     if(!objects.Any(a=> a.ID == MyObject.ID)) 
     { 
      objects.Add(object); 
      _cache.AddReplaceCache(objects); 
     } 

    } 

注:該鍵可以在對象上的任何屬性或屬性MYOBJECT

+0

好像這應該是一個檢查執行上面這一層,你會用你的功能。我只是讓重複鍵的問題在數據庫級失敗,因爲它不應該到達版本庫。然後再次我不會使用通用的存儲庫。 –

回答

1

你可以讓你的實體從一個公共接口繼承:

public interface IEntity 
{ 
    int ID { get; set; } 
} 

然後,你可以重新定義你的方法一樣

public void AddItem<TEntity>(TEntity entity) where TEntity : IEntity 
{ 
    // Now you can access entity.ID 
} 

現在,如果你並不總是想比較通過ID,那麼你可以添加一個謂詞到你的方法中:

public void AddItem<TEntity>(TEntity entity, Func<TEntity, bool> predicate) 
{ 
    var objects = GetAllItems().ToList(); 

    // You might need some logic in the predicate to check for null 
    if(!objects.Any(a => predicate(a as TEntity)) 
    { 
     objects.Add(entity); 
     _cache.AddReplaceCache(objects); 
    } 

} 

然後作爲

repository.AddItem(entity, e => e.ID == entity.ID && e.OtherProperty == entity.OtherProperty); 
+0

工程就像一個魅力!謝謝! – cal5barton

0

如果我的理解是否正確的問題是TEntity沒有財產ID。因此,讓您的實體繼承具有例如ID列的通用界面。

public interface IObject 
{ 
    int ID {get; set;} 

    //define all other properties which are shared between your Entities. 
} 
public class MyObject : IObject 
{ 
    public int ID {get; set;} 

    //other properties. 
} 

public void AddItem(TEntity item): where TEntity:IObject 
{ 
    var entities = GetAllItems().ToList(); //Method gets cached IEnumerable<TEntity> 

    if(!objects.Any(a=> a.ID == item.ID))//Generically see if TEntity is already in the list based of defined properties 
    { 
     entities.Add(item); 
    } 

} 
+0

據我所知,每個實體可以有一個由多個字段組成的組合鍵,這些字段將被傳入並用於檢查重複項。 –

+0

@ stephen.vakil他正在談論一些「關鍵」,但我只是寫他的代碼來與泛型一起工作。如果他有由多個字段組成的鍵,他需要在界面中定義它們,然後取出數據。該過程應該是相同的 – mybirthname

相關問題