2013-07-05 91 views
0

我不刪除實體。我只是通過IsDeleted屬性來簽署它們。問題是,當我得到一個父元素時,即使IsDeleted propery是true或false,它的所有子元素也會被加載。然後我做了類似下面的事情,但我想知道有沒有更好的方法來做到這一點?在實體框架中篩選子實體的最佳方式

var result = from p in context.Set<Product>().Include(x => x.Reviews) 
         select new 
          { 
           Product = x, 
           ProductReviews = x.ProductReviews.Where(y => !y.IsDeleted) 
          }; 

var products = new List<Product>(); 

      foreach (var product in result.OrderBy(x => x.Product.Id).Skip(skipRecords).Take(pageSize)) 
      { 
       var p = new Product(); 
       p = product.Product; 
       p.ProductReviews = product.ProductReviews.ToList(); 

       products.Add(p); 
      } 

return products; 

如何改進此代碼塊?

感謝

+0

當你說所有加載的孩子都是真或假時,你是什麼意思?該過濾器不工作?或者它加載或孩子和他們通過isDeleted過濾? – Overmachine

+0

有些子實體被刪除,因此IsDeleted prop對它們是1。但我只想得到實體的IsDeleted prop爲0時。 –

回答

2

我做的事,以解決這種情況之前是創建一個特定的接口這標誌着在「標誌刪除」像這樣,然後創建一個過濾出來的擴展方法的類。

如果您只有一個具有IsDeleted屬性的類,那麼您不需要單獨的接口,而只需使用該類即可。但是我暫時假設你有多個類,並且需要這個接口。

所以該接口將被定義,像這樣:

public interface IHaveIsDeleted 
{ 
    public bool IsDeleted { get; set; } 
} 

然後,我的擴展方法將在靜態類中定義,像這樣:

public static class MyExtensionMethods 
{ 
    public IQueryable<T> FilterDeleted(this IQueryable<T> src) where T : IHaveIsDeleted 
    { 
    return src.Where(x => !x.IsDeleted); 
    } 
} 

因爲這是上IQueryable<T>完成, where子句被內置到發送到數據庫的查詢中,因此不會有任何返回IsDeleted爲真的記錄。因此,你所要做的就是撥打x.ProductReviews.FilterDeleted()

現在,我使用這種方法的項目實際上使用了LINQ2SQL。我自己對EF很新,所以可能會有更具體的EF方法來做這件事,(或許可能是某種Type Per Hierarchy結構,或許?),但我認爲這至少有助於您的查詢更簡單。

希望有幫助! ;)

+1

是否有「LOL cat」這個接口的名字?哈哈 –

+0

LOL。實際上,在我的項目中,該屬性被稱爲FlagDelete,因此該接口被稱爲IHaveFlagDelete。我只是試圖調整它的OP的IsDeleted屬性,但我想IHaveIsDeleted是一個非常有趣的聽起來的名字。 IHasSetUpTheBomb如何? LMAO;) – CptRobby