2013-02-20 34 views
1

我使用EF與DTO分離的模型,並且因爲我需要爲許多類實現相同的功能(GetByPrimarykey,GetBy,GetAll等),我認爲它會是很高興有抽象類:實體框架在查詢之外生成謂詞函數

 protected List<T> GetBy(Func<T, bool> func) 
     { 
      return WorkingSet.Where(func).ToList(); 
     } 
     protected T GetFirstBy(Func<T, bool> func) 
     { 
      return WorkingSet.FirstOrDefault(func); 
     } 
     public virtual T GetByPrimaryKey(K key) 
     { 
      return WorkingSet.FirstOrDefault(GetByKeyPredict(key)); 
     } 

然後簡單地實現在實現類的predicte功能:

protected override Func<MyType, bool> GetByKeyPredict(int key) 
{ 
    return (c=> c.MyTypeId==key); 
} 

的問題是,當我運行SQL Server事件探查,我看到了塞萊ct沒有什麼原因。如果我重寫GetByPrimaryKey功能:

public override MyTypeGetByPrimaryKey(int key) 
{ 
    return WorkingSet.FirstOrDefault(s => s.MyTypeId== key); 
} 

查詢是好的,但是,我真的需要預測,因爲我們的GetBy功能被證明是非常有用的工作。

回答

3

您需要使用Expression才能獲得SQL轉換。例如

protected List<T> GetBy(Expression<Func<T, bool>> func) 
     { 
      return WorkingSet.Where(func).ToList(); 
     } 
     protected T GetFirstBy(Expression<Func<T, bool>> func) 
     { 
      return WorkingSet.FirstOrDefault(func); 
     } 

你的情況我們的目標是用的,而不是從IEnumerable的IQueryable的方法,因爲IQueryable的方法得到轉換爲SQL。 我希望有所幫助。

+0

幫助,解決問題並解釋它很好的答案:) – SimSimY 2013-02-21 13:34:12