如何定义Linq扩展方法

时间:2010-01-12 18:56:33

标签: linq-to-entities

我正在尝试在选定的答案中运行代码,但无法弄明白 link text

这是我的代码:

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));
        }
    }
}

任何想法

1 个答案:

答案 0 :(得分:4)

扩展方法很棘手,因为在编写扩展后它们不会被自动拾取。您需要添加using指令或添加引用,然后根据放置扩展方法的位置添加using指令。

这是因为扩展方法正在添加到类中,但不是以传统方式添加到部分类中。你正在扩展这个类,但是,它们并不是真正面向对象的,所以它们需要你做更多的工作才能消耗它们,但它们会混淆吗?

以下内容应该有所帮助:

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());
     }
  }
}

干杯!