2012-02-24 17 views
6

MVC3, Khuôn khổ thực thể 4.1 Mã đầu tiên.Biểu thức LINQ động để sắp xếp thuộc tính điều hướng

Làm việc với 2 bảng

mẫu:

public class UniversityMaster 
{ 
    [Key] 
    public string UniversityId { get; set; } 
    public string UniversityName { get; set; } 

} 

public class ProgramMaster 
{ 
    [Key] 
    public string ProgramId { get; set; } 
    public string ProgramName { get; set; } 
    public string UniversityId { get; set; } 
    public virtual UniversityMaster University { get; set; } // navigation property 

} 

động biểu để phân loại (chỉ để tránh một tuyên bố trường hợp chuyển đổi):

public virtual IQueryable<ProgramMaster> GetQueryableSort(string sortField="", string sortDirection="") 
    { 
     IQueryable<ProgramMaster> query = _dbSet; 
     ParameterExpression pe = Expression.Parameter(typeof(ProgramMaster), string.Empty); 
     MemberExpression property = Expression.PropertyOrField(pe, sortField); 
    //get a exception here if the sort field is of navigation property       (University.UniversityName) 
     LambdaExpression lambda = Expression.Lambda(property, pe); 
     if (sortDirection == "ASC") 
     orderbydir = "OrderBy"; 
     else 
     orderbydir = "OrderByDescending"; 
     MethodCallExpression call = Expression.Call(typeof(Queryable), 
     orderbydir, new Type[] { typeof(TEntity), property.Type }, query.Expression, Expression.Quote(lambda)); 

     var returnquery = (IOrderedQueryable<ProgramMaster>)query.Provider.CreateQuery<ProgramMaster>(call); 
     return returnquery; 
    } 

Các trang được hiển thị một mạng lưới với hai cột Tên chương trình và tên trường đại học sử dụng webgrid. Việc phân loại hoạt động tốt cho cột Tên chương trình, tuy nhiên không thành công nếu được sắp xếp theo tên trường đại học vì thuộc tính này nằm trong UniversityMaster và Expression.PropertyOrField tìm kiếm thuộc tính này trong ProgramMaster. Dưới đây là những ngoại lệ:

University.UniversityName 'không phải là một thành viên của loại' App.Core.Model.ProgramMaster

Câu hỏi của tôi là làm thế nào tôi thực hiện tác phẩm này với bất động sản chuyển hướng của lớp mô hình của tôi .

Hy vọng tôi đã có thể giải thích kịch bản. Bất kỳ trợ giúp được đánh giá cao.

Trả lời

0

Đó là vì MemberExpression đang cố gắng gọi cho thành viên có tên Univerty.UniversityName trên tham số. Những gì bạn muốn làm là gọi một thành viên có tên Univerity trên tham số, sau đó gọi số UniversityName trên đó. Có hiệu quả, bạn cần phải lặp lại giải quyết tên thuộc tính.

public virtual IQueryable<ProgramMaster> GetQueryableSort(string sortField = "", string sortDirection = "") 
{ 
    IQueryable<ProgramMaster> query = _dbSet; 

    var propertyNames = sortField.Split("."); 

    ParameterExpression pe = Expression.Parameter(typeof(ProgramMaster), string.Empty); 
    Expression property = pe; 
    foreach(var prop in propertyName) 
    { 
     property = Expression.PropertyOrField(property, prop); 
    } 

    LambdaExpression lambda = Expression.Lambda(property, pe); 

    if (sortDirection == "ASC") 
     orderbydir = "OrderBy"; 
    else 
     orderbydir = "OrderByDescending"; 

    MethodCallExpression call = Expression.Call(
     typeof(Queryable), 
     orderbydir, 
     new Type[] { typeof(TEntity), property.Type }, 
     query.Expression, 
     Expression.Quote(lambda)); 

    var returnquery = (IOrderedQueryable<ProgramMaster>)query.Provider.CreateQuery<ProgramMaster>(call); 

    return returnquery; 
} 
1

Microsoft có lớp DynamicQueryable có thể được sử dụng để tạo động một số phần nhất định của truy vấn LINQ bằng chuỗi. Với điều này bạn có thể nói myQuery.OrderBy ("University.UniversityName") và nó sẽ xử lý việc xây dựng biểu thức. Thư viện tương tự cũng hỗ trợ xây dựng động các mệnh đề SELECT và WHERE.

Bạn có thể tìm thấy bản sao của nguồn như một phần của gói EntityFramework.Extended tuyệt vời của Loresoft. Tệp của Microsoft là https://github.com/loresoft/EntityFramework.Extended/blob/master/Source/EntityFramework.Extended/Dynamic/DynamicQueryable.cs

Các vấn đề liên quan