2013-02-10 109 views
1

我有以下功能如何結合2 Linq的謂詞〜C#

public virtual ICollection<T> initData<T>(System.Data.Entity.DbSet<T> set, System.Linq.Expressions.Expression<Func<T, bool>> filter) where T : CModel<T> 
     { 
      var x = (from dc in set select dc); 
      if (!this.db.valid) 
      { 
       System.Linq.Expressions.Expression<Func<T, bool>> active = a => a.active; 
       filter = (Expression<Func<T, bool>>)Expression.Lambda(Expression.AndAlso(filter, active)); 
       x.Where(filter); 

      } 
      else 
      { 
       x.Where(filter); 
      } 
      return (ICollection<T>)x.ToList(); 
     } 

當過我嘗試了2個謂詞與AndAlso結合我拋出一個異常:

The binary operator AndAlso is not defined for the types 'System.Func`2[namespace.Models.MyClass,System.Boolean]' and 'System.Func`2[namespace.Models.MyClass,System.Boolean]'. 

我怎麼能結合這兩個條件?

+0

您可以使用謂詞構建器。 http://www.albahari.com/nutshell/predicatebuilder.aspx – Flowerking 2013-02-10 10:57:04

+0

[LINQ to Entities:Combining Predicates](http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-到實體,合併,predicates.aspx) – 2014-06-17 05:38:16

回答

1

我認爲你正在爲自己而努力。你可以只使用Where擴展方法多次這樣的:

public virtual ICollection<T> initData<T>(System.Data.Entity.DbSet<T> set, System.Linq.Expressions.Expression<Func<T, bool>> filter) where T : CModel<T> 
{ 
    var x = (from dc in set select dc); 
    x = set.Where(filter); 

    if (!this.db.valid) 
    { 
     x = x.Where(a => a.active); 
    } 

    return x.ToList(); 
} 

注意,在你的代碼中使用x.Where(filter);
這是無用的,因爲如果沒有發生變異X,所以結果基本上丟棄。 要保留結果,您需要將其分配給某些東西: x = x.Where(filter);
這與使用字符串時的想法是一樣的。

 

第二個答案:

有一個內置的代表呼籲Predicate<T>。我認爲使用這種類型的運氣可能比Func<T, bool>有更多的運氣,即使它們本質上具有相同的含義。我認爲這是編譯器錯誤想要說的。