2015-10-15 48 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