2010-01-12 4 views
0

Je suis en train d'exécuter le code là-dedans choisi réponse mais ne peut pas le comprendre link textComment définir une méthode d'extension LINQ

Voici mon code:

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

Toutes les idées

Répondre

4

Extensions Les méthodes sont délicates en ce sens qu'elles ne sont pas automatiquement récupérées après que vous en ayez écrit une. Vous devez ajouter une directive using ou ajouter une référence, puis une directive using en fonction de l'emplacement de votre méthode d'extension. Ceci est dû au fait que les méthodes d'extension s'ajoutent à une classe, mais pas de la manière traditionnelle, par exemple une classe partielle. Vous étendez la classe, cependant, ils ne sont pas vraiment orientés objet, donc ils nécessitent plus de travail de votre part avant de pouvoir les consommer, encore confus?

Ce qui suit devrait aider:

using System.Linq.IQueryable 

personnellement, je les diviser en un espace de nommage appelé « ExtensionMethods », puis encore les subdiviser dans d'autres espaces de noms sur le but, cela aidera votre santé mentale.

Il n'y a pas de limite au nombre d'espaces de noms que vous pouvez imbriquer, mais il y a une limite au nombre de classes statiques que vous pouvez imbriquer.

Et dans le code qui l'appelle, une fois que vous avez frappé la période, vous devriez le voir dans la liste de remplissage automatique.

Je vais poster un exemple si vous avez besoin de plus d'aide.

Exemple:

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

Cheers!

Questions connexes