2010-03-30 16 views

Respuesta

7

No hay una nueva forma de acceder a la longitud de una propiedad en EF 4.0. Todavía tiene que caminar sobre los metadatos, como se muestra en in the accepted answer on the question you reference.

Alex James

Ex miembro del equipo EF!

+0

Esto es válido para EF 5? –

0

Esto actúa:

using System; 
using System.Data.Objects; 
using System.Data.Objects.DataClasses; 
using System.Data.Metadata.Edm; 
using System.Linq; 
using System.Linq.Expressions; 

namespace EfWidgets 
{ 
    public class EntityWidgets 
    { 
     public static int GetMaxLength<TEntity>(ObjectContext oc, Expression<Func<TEntity, string>> property) 
      where TEntity : EntityObject 
     { 
      var test = oc.MetadataWorkspace.GetItems(DataSpace.CSpace); 

      if (test == null) 
       return -1; 

      Type entType = typeof(TEntity); 
      string propertyName = ((MemberExpression)property.Body).Member.Name; 

      var q = test 
       .Where(m => m.BuiltInTypeKind == BuiltInTypeKind.EntityType) 
       .SelectMany(meta => ((EntityType)meta).Properties 
       .Where(p => p.Name == propertyName && p.TypeUsage.EdmType.Name == "String")); 

      var queryResult = q.Where(p => 
      { 
       var match = p.DeclaringType.Name == entType.Name; 
       if (!match) 
        match = entType.Name == p.DeclaringType.Name; 

       return match; 

      }) 
       .Select(sel => sel.TypeUsage.Facets["MaxLength"].Value) 
       .ToList(); 

      if (queryResult.Any()) 
      { 
       int result = Convert.ToInt32(queryResult.First()); 
       return result; 
      } 
      return -1; 
     } 
    } 
} 
+0

Ejemplo de uso: maxLength = GetMaxLength (northwindContext, Product => Product.QuantityPerUnit); –

+0

¿Es mejor que el método similar (pero más corto) de http://stackoverflow.com/a/772556/52277? –

Cuestiones relacionadas