2010-03-30 5 views

Antwort

7

Es gibt keine neue Möglichkeit, auf die Länge einer Eigenschaft in EF 4.0 zuzugreifen. Sie müssen immer noch über die Metadaten gehen - wie gezeigt in the accepted answer on the question you reference.

Alex James

Ehemaliger EF-Teammitglied!

+0

Dies gilt für EF 5? –

0

Dies wirkt:

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

Anwendungsbeispiel: maxLength = GetMaxLength (NorthwindContext, Produkt => Product.QuantityPerUnit); –

+0

Ist es besser als ähnliche (aber kürzere) Methode von http://stackoverflow.com/a/772556/52277? –

Verwandte Themen