2014-03-01 97 views
0

排序依據(propertyName的)複雜類型

class User 
{ 
    public string Name {get; set; } 
} 

class Example 
{ 
    public virtual User user {get; set; } 
} 

他們1..1關係,我使用EF和所有工作正常,但我想做

var model = examples.OrderBy("user.Name"); 

其中的例子是IQueryable的例子,我得到錯誤,示例沒有user.Name的屬性。這是爲什麼?我可以爲班級用戶指定比較規則嗎?我嘗試實現ICompare和IComparable沒有成功。

編輯: 這是排序依據的延長,我怎麼可以修改它能夠使用它爲我的例子

public static IQueryable OrderBy(this IQueryable source, string propertyName) 

{ 

    var x = Expression.Parameter(source.ElementType, "x"); 

    var selector = Expression.Lambda(Expression.PropertyOrField(x, propertyName), x); 

    return source.Provider.CreateQuery(

     Expression.Call(typeof(Queryable), "OrderBy", new Type[] { source.ElementType, selector.Body.Type }, 

      source.Expression, selector 

      )); 

     } 

} 

回答

3

直截了當的:

examples.OrderBy(x => x.user.Name); 

應該只是罰款。但是,通常OrderBy不會消耗一個字符串 - 您是否有理由利用該語法?

+0

我有表和列名作爲字符串,我需要通過這些名稱進行排序,我知道我可以使用上面的代碼與很多ifs,但我想知道爲什麼我的代碼不工作。 – Medo

+0

我剛剛意識到這是我們項目中有人寫的擴展。我將編輯問題 – Medo

+1

@Medo,您正在使用的擴展方法不支持點符號。特別是'Expression.PropertyOrField(x,propertyName)'只能深入一層。你有沒有考慮過使用更加全面的API,如[動態LINQ](http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-動態查詢library.aspx)? –

0

我認爲你正在尋找:

List<User> SortedList = examples.OrderBy(u=>u.Name).ToList();

您必須使用LINQ

+0

我剛編輯過,請看看 – Medo