Как определить метод расширения Linq - PullRequest
0 голосов
/ 12 января 2010

Я пытаюсь запустить код в выбранном ответе, но не могу понять текст ссылки

Вот мой код:

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 Ответ

4 голосов
/ 12 января 2010

Расширения Методы хитры в том, что они не выбираются автоматически после того, как вы их напишите. Вам нужно либо добавить директиву 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());
     }
  }
}

Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...