DbSet

2014-10-24 14 views
6
ile OrderBy'yi Uygula

Genel depolamayla sayfalandırma ve sıralama yapmayı deniyorum. Birincil anahtar sütunu DbSet'te sütuna göre varsayılan sipariş olarak nasıl alınır?DbSet

public static string GetKeyField(Type type) 
{ 
    var allProperties = type.GetProperties(); 

    var keyProperty = allProperties.SingleOrDefault(p => p.IsDefined(typeof(KeyAttribute))); 

    return keyProperty != null ? keyProperty.Name : null; 
} 

public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string orderBy) 
{ 
    return source.GetOrderByQuery(orderBy, "OrderBy"); 
} 

public static IQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string orderBy) 
{ 
    return source.GetOrderByQuery(orderBy, "OrderByDescending"); 
} 

private static IQueryable<T> GetOrderByQuery<T>(this IQueryable<T> source, string orderBy, string methodName) 
    { 
     var sourceType = typeof(T); 
     var property = sourceType.GetProperty(orderBy); 
     var parameterExpression = Expression.Parameter(sourceType, "x"); 
     var getPropertyExpression = Expression.MakeMemberAccess(parameterExpression, property); 
     var orderByExpression = Expression.Lambda(getPropertyExpression, parameterExpression); 
     var resultExpression = Expression.Call(typeof(Queryable), methodName, 
               new[] { sourceType, property.PropertyType }, source.Expression, 
               orderByExpression); 

     return source.Provider.CreateQuery<T>(resultExpression); 
    } 

Bu, bir dize olarak özellik adını geçmek ve düzenli LINQ OrderBy geçer bir ifade kılması (:

DbSet = Context.Set<T>(); 

public IQueryable<T> GetAll(int pageNumber = 0, int pageSize = 10, string sortColumn = "") 
{ 
    return DbSet.OrderBy("how to use primary key column here").Skip(pageNumber * pageSize)Take(pageSize); 
} 
+0

yan not, Eminim 'Skip' istiyorum' Take' – Jonesopolis

+0

@Jonesy, Evet Teşekkürler, değişti ... –

cevap

6

Benzer bir şey başarmak için bu uzatma yöntemleri kullandık) işlevi. senin durumunda Yani, kullanım olacaktır:

DbSet = Context.Set<T>(); 

public IQueryable<T> GetAll(int pageNumber = 0, int pageSize = 10, string sortColumn = "") 
{ 
    return DbSet.OrderBy(GetKeyField(typeof(T))).Skip(pageNumber * pageSize)Take(pageSize); 
} 

Bu düzgün Key özniteliği ile süslüdür senin varlık sınıfında anahtar alanını varsayar.

+0

+1, çok kullanışlı bir ... –

+1

Harika ve esnek bir çözüm, kaydedildi bana çok zaman var. Teşekkür ederim! – Oleg

+0

Bir çekicilik gibi çalışır. Teşekkür ederim! –

0

bir yolu tüm varlıkları onların birincil anahtar değerini almak için izin veren bazı arabirimden kalıtımla sahip olacaktır:

public interface IIdentifiableEntity 
{ 
    public int Id {get; set;} 
} 

Sonra uygulamaları olacak gibi: Sonra

public class User : IIdentifiableEntity 
{ 
    public int UserId {get; set;} 

    //other properties... 

    public int Id { get { return UserId; } set { UserId = value; } } 
} 

o olur Id tarafından sipariş vermek kadar kolay olun. Bu desen diğer alanlarda da size yardımcı olabilir.