linq - operator - c# question mark




在LINQ中有多個“order by” (4)

我有兩個表格, moviescategories ,我首先按類別ID獲取有序列表,然後按名稱

電影表有三列, ID,名稱和CategoryID 。 類別表2具有列, ID和名稱

我嘗試了類似於以下的內容,但它不起作用。

var movies = _db.Movies.OrderBy( m => { m.CategoryID, m.Name })

使用DataContext中的以下行將DataContext上的SQL活動記錄到控制台 - 然後您可以準確查看linq語句從數據庫請求的內容:

_db.Log = Console.Out

以下LINQ語句:

var movies = from row in _db.Movies 
             orderby row.CategoryID, row.Name
             select row;

var movies = _db.Movies.OrderBy(m => m.CategoryID).ThenBy(m => m.Name);

生成以下SQL:

SELECT [t0].ID, [t0].[Name], [t0].CategoryID
FROM [dbo].[Movies] as [t0]
ORDER BY [t0].CategoryID, [t0].[Name]

然而,在Linq中重複OrderBy似乎會顛倒產生的SQL輸出:

var movies = from row in _db.Movies 
             orderby row.CategoryID
             orderby row.Name
             select row;

var movies = _db.Movies.OrderBy(m => m.CategoryID).OrderBy(m => m.Name);

產生以下SQL(Name和CategoryId被切換):

SELECT [t0].ID, [t0].[Name], [t0].CategoryID
FROM [dbo].[Movies] as [t0]
ORDER BY [t0].[Name], [t0].CategoryID

使用非lambda,查詢語法LINQ,你可以這樣做:

var movies = from row in _db.Movies 
             orderby row.Category, row.Name
             select row;

[編輯解決評論]要控制排序順序,使用關鍵字ascending (這是默認的,因此不是特別有用)或descending ,如下所示:

var movies = from row in _db.Movies 
             orderby row.Category descending, row.Name
             select row;

添新”:

var movies = _db.Movies.OrderBy( m => new { m.CategoryID, m.Name })

這對我的箱子有用。 它確實會返回可用於排序的內容。 它返回一個有兩個值的對象。

類似但不同於按組合列排序,如下所示。

var movies = _db.Movies.OrderBy( m => (m.CategoryID.ToString() + m.Name))

至少有一種方法可以使用LINQ來做到這一點,儘管不是最簡單的方法。 你可以通過使用使用IComparerOrberBy()方法來完成。 首先你需要像這樣為Movie類實現一個IComparer

public class MovieComparer : IComparer<Movie>
{
    public int Compare(Movie x, Movie y)
    {
        if (x.CategoryId == y.CategoryId)
        {
            return x.Name.CompareTo(y.Name);
        }
        else
        {
            return x.CategoryId.CompareTo(y.CategoryId);
        }
    }
}

然後,您可以使用以下語法訂購電影:

var movies = _db.Movies.OrderBy(item => item, new MovieComparer());

如果您需要將順序切換為降序,則只需在MovieComparerCompare()方法內相應切換x和y MovieComparer





sql-order-by