2015-10-15 52 views
1

我想知道在創建歷史記錄和依賴關係時,比較創建的對象狀態並將對象狀態更改爲非活動狀態(已刪除)的最佳方法是什麼。使用實體框架的最佳比較算法

這也意味着即時比較關係表(MarketCookies)內的過去和現在的對象。

Id  | CookieID | MarketID 

我發現的醜陋的解決方案是計算有多少物體有變化。
爲此讓打電話過去的項目:ListP
而新的項目:LISTF

我分這個方法分爲三步:

1 - 計數兩個列表;
2 - 查找ListP中不存在於List F中的對象,並將其狀態更改爲Inactive並更新它們;
3 - 創建新對象並保存它們。

但是這段代碼很難維護..我怎樣才能使一個簡單的代碼來維護和保持功能?

市場莫代爾:

public class Market() 
{ 
    public ICollection<Cookie> Cookies {get; set;} 
} 

餅乾模態:

public class Cookie() 
{ 
    public int Id {get;set;} 

    //Foreign Key 
    public int CookieID {get;set} 

    //Foreign Key 
    public int MarketID {get;set;} 
} 

代碼:

public void UpdateMarket (Market Market, int Id) 
    { 
    var ListP = MarketCookiesRepository.GetAll() 
       .Where(x => x.MarketID == Id && Market.State != "Inactive").ToList(); 
    var ListF = Market.Cookies.ToList(); 
    int ListPCount = ListP.Count(); 
    int ListFCount = ListF.Count(); 

    if(ListPCount > ListFCount) 
    { 
     ListP.Foreach(x => 
     { 
      var ItemExists = ListF.Where(y => y.Id == x.Id).FirstOrDefault(); 

      if(ItemExists == null) 
      { 
       //Delete the Object 
      } 
     }); 

     ListF.Foreach(x => 
     { 
      var ItemExists = ListP.Where(y => y.Id == x.Id).FirstOrDefault(); 

      if(ItemExists == null) 
      { 
       //Create Object 
      } 
     }); 
    } 
    else if(ListPCount < ListFCount) 
      { 
       ListF.Foreach(x => 
       { 
       var ItemExists = ListP.Where(y => y.Id == x.Id).FirstOrDefault(); 

       if(ItemExists == null) 
       { 
        //Create Objects 
       } 
       }); 

       ListP.Foreach(x => 
       { 
       var ItemExists = ListF.Where(y => y.Id == x.Id).FirstOrDefault(); 

       if(ItemExists == null) 
       { 
        //Delete Objects 
       } 
       }); 
      } 
      else if(ListPCount == ListFCount) 
       { 
        ListP.Foreach(x => 
        { 
         var ItemExists = ListF.Where(y => y.Id == x.Id).FirstOrDefault(); 

         if(ItemExists == null) 
         { 
          //Delete Objects 
         } 
        }); 

        ListF.Foreach(x => 
        { 
         var ItemExists = ListP.Where(y => y.Id == x.Id).FirstOrDefault(); 

         if(ItemExists == null) 
         { 
          //Create Objects 
         } 
        }); 
       } 
    } 
+0

看看設置專門的包含,並添加方法。看到https://msdn.microsoft.com/en-us/library/bb359438(v=vs.110).aspx –

+0

你可以簡單地做一個除了選擇語句,它具有相同的功能?或者我理解錯了什麼? – DevilSuichiro

回答

1

沒有a good, minimal, complete code example,清楚地說明了問題,很難確切地知道什麼連好實現看起來像,不要介意「最好的」。但是,根據您的描述,看起來LINQ Except()方法實際上可以很好地滿足您的需求。例如:

public void UpdateMarket (Market Market, int Id) 
{ 
    var ListP = MarketCookiesRepository.GetAll() 
       .Where(x => x.MarketID == Id && Market.State != "Inactive").ToList(); 
    var ListF = Market.Cookies.ToList(); 

    foreach (var item in ListP.Except(ListF)) 
    { 
     // set to inactive 
    } 

    foreach (var item in ListF.Except(ListP)) 
    { 
     // create new object 
    } 
} 

當然,這是假設你的對象已經覆蓋Equals()GetHashCode()。如果沒有,您可以爲上述提供您自己的實現IEqualityComparer<T>。例如:

// General-purpose equality comparer implementation for convenience. 
// Rather than declaring a new class for each time you want an 
// IEqualityComparer<T>, just pass this class appropriate delegates 
// to define the actual implementation desired. 
class GeneralEqualityComparer<T> : IEqualityComparer<T> 
{ 
    private readonly Func<T, T, bool> _equals; 
    private readonly Func<T, int> _getHashCode; 

    public GeneralEqualityComparer(Func<T, T, bool> equals, Func<T, int> getHashCode) 
    { 
     _equals = equals; 
     _getHashCode = getHashCode; 
    } 

    public bool Equals(T t1, T t2) 
    { 
     return _equals(t1, t2); 
    } 

    public int GetHashCode(T t) 
    { 
     return _getHashCode(t); 
    } 
} 

像這樣來使用:

public void UpdateMarket (Market Market, int Id) 
{ 
    var ListP = MarketCookiesRepository.GetAll() 
       .Where(x => x.MarketID == Id && Market.State != "Inactive").ToList(); 
    var ListF = Market.Cookies.ToList(); 
    IEqualityComparer<Cookie> comparer = new GeneralEqualityComparer<Cookie>(
     (t1, t2) => t1.Id == t2.Id, t => t.Id.GetHashCode()); 

    foreach (var item in ListP.Except(ListF, comparer)) 
    { 
     // set to inactive 
    } 

    foreach (var item in ListF.Except(ListP, comparer)) 
    { 
     // create new object 
    } 
} 
+0

太棒了!謝謝! – BrunoMartinsPro