2010-01-12 38 views
0

我想在有選擇的答案運行的代碼,但不能弄明白 link text如何定義一個LINQ擴展方法

這裏是我的代碼:

using System; 
using System.Data; 
using System.Data.Objects; 
using System.Configuration; 
using System.Linq; 
using System.Linq.Expressions; 
using System.Collections; 
using System.Collections.Generic; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Xml.Linq; 


namespace System.Linq.IQueryable 
{ 
    static public class LinqExtensions 
    { 
     public static IQueryable<TEntity> WhereIn<TEntity, TValue> 
    (
     this ObjectQuery<TEntity> query, 
     Expression<Func<TEntity, TValue>> selector, 
     IEnumerable<TValue> collection 
    ) 
     { 
      if (selector == null) throw new ArgumentNullException("selector"); 
      if (collection == null) throw new ArgumentNullException("collection"); 
      ParameterExpression p = selector.Parameters.Single(); 

      if (!collection.Any()) return query; 

      IEnumerable<Expression> equals = collection.Select(value => 
       (Expression)Expression.Equal(selector.Body, 
        Expression.Constant(value, typeof(TValue)))); 

      Expression body = equals.Aggregate((accumulate, equal) => 
       Expression.Or(accumulate, equal)); 

      return query.Where(Expression.Lambda<Func<TEntity, bool>>(body, p)); 
     } 
    } 
} 

任何想法

回答

4

擴展方法很棘手,因爲它們在寫入之後不會自動拾取。您需要添加使用指令或添加引用,然後使用指令,具體取決於您放置擴展方法的位置。

這是因爲擴展方法正在添加到類中,而不是以傳統的方式說分部類。你正在擴大課程,但是,它們並不是真正面向對象的,所以在你消耗它們之前,你需要做更多的工作,而且還會感到困惑?

以下應該有所幫助:

using System.Linq.IQueryable 

個人而言,我將其劃分爲一個名爲「ExtensionMethods」命名空間,然後向它們進一步細分爲基於目的以外的命名空間,這將有助於你的理智。

您可以嵌套的命名空間的數量沒有限制,但是您可以嵌套的靜態類的數量是有限制的。

而在調用它的代碼中,一旦你點擊了句點,就應該在自動完成列表中看到它。

我會發佈一個例子,如果你需要更多的幫助。

例子:

Extensions.cs

using System; 

namespace Foo 
{ 
    namespace Bar 
    { 
    public static class RangeExtensions 
    { 
     public static string ToColumnLetter(this int col) 
     { 
      ... //universal notation for magic :) 
     } 
    } 
    } 
} 

Usage.cs

using System; 
using Foo.Bar; 

namespace Foo2 
{ 
    public class Bar2 
    { 
    public void ExtensionSample 
    { 
     Range range = .... 

     Console.WriteLine(range.Column.ToColumnLetter()); 
    } 
    } 
} 

乾杯!