2012-10-10 140 views
0
特定元素

我的情況是:我有一個使用LINQ稱爲MenuBO類,它有一個名爲SelectAll()函數,返回對象menu的列表作爲DataSource使用了DropDownList。返回之前,我需要在列表中插入一個新的項目,以作爲該DropDownList排序依據在列表

這裏的默認值是我試過到目前爲止:

public List<menu> SelectAll() 
{ 
    using (var db = new SeloQual_AdminEntities(conn)) 
    { 
     menu vmenu = new menu(); 
     vmenu.cod_menu = 0; 
     vmenu.cod_menu_pai = null; 
     vmenu.des_menu = "Select..."; 
     var query = from p in db.menu orderby p.des_menu select p; 
     var test = query.ToList(); 
     test.Add(vmenu); 
     return test.OrderBy(x => x.cod_menu).ToList(); 
    } 
} 

OrderBy(x => x.cod_menu)不工作,它出現的vmenu項目在我想要的頂部,但我需要其他項目由des_menu訂購。我想是這樣

return teste.OrderBy(x => x.cod_menu).ThenBy(y => y.des_menu).ToList(); 

但是,當然,沒有工作,所以我的一些需要幫助的第一個

回答

3

後只訂購的元素,我認爲你真正想要的是下面的代碼:

menu vmenu = new menu(); 
vmenu.cod_menu = 0; 
vmenu.cod_menu_pai = null; 
vmenu.des_menu = "Select..."; 
var query = from p in db.menu orderby p.des_menu select p; 

List<menu> result = new List<menu>(); 
result.Add(vmenu); 
result.AddRange(query); 
return result; 

這可以通過簡單地添加默認菜單項並以查詢中定義的順序添加已排序的菜單項來優雅地解決您的問題。

+0

另一種可能的方式,如果你想避免勢在必行建立名單:'返回新的[] {} VMENU .Concat(查詢).ToList() ;' – cdhowie

+0

@cdhowie:我覺得這非常不可讀,如果可能的話避免它。 –

+0

不要說這是OP應該去的方式,只是指出它作爲替代。 – cdhowie

1

你可以只使用Insert,而不是添加

var vmenu = new menu{ 
    cod_menu = 0, 
    des_menu="Select..." 
    }; 
List<menu>res = db.menu.OrderBy(p => p.des_menu).ToList(); 
res.Insert(0,vmenu); 
return res; 
+1

一個有效的技術,但引入了不必要的性能問題;如果結果集相當大,則會將結果放入列表中,然後將所有列表元素向下移動一個。 (嗯,它會這樣做,無論如何,但如果結果集很大,它可能會成爲瓶頸。) – cdhowie

+0

謝謝,它的工作原理是,認爲使用'Insert'將替換列表的位置0而不是將其移動, 謝謝! –

+0

@cdhowie我同意(不確定這將是性能瓶頸,但是,Daniel的答案更好)。 –