C# 如何使用匿名类型的动态OrderBy变量?

C# 如何使用匿名类型的动态OrderBy变量?,c#,linq,dynamic,.net-3.5,C#,Linq,Dynamic,.net 3.5,我有几个网站,在主页上加载文章。我可以设置文章的排名,以不同的顺序显示它们,但在不同的网站上,文章的顺序可能会有所不同 我必须订购物品的代码为所有网站设置了相同的订购顺序: string officeLocation = ""; // office location could be either World, Europe, Africa, America, Asia, Pacific var result = articles.Select(a => new

我有几个网站,在主页上加载文章。我可以设置文章的排名,以不同的顺序显示它们,但在不同的网站上,文章的顺序可能会有所不同

我必须订购物品的代码为所有网站设置了相同的订购顺序:

    string officeLocation = "";
    // office location could be either World, Europe, Africa, America, Asia, Pacific

    var result = articles.Select(a => new
    {
        Title = a.Title,
        Url = a[SPBuiltInFieldId.FileRef],
        Byline = a[Constants.FieldNames.Byline],
        ArticleDate = a[Constants.FieldNames.ArticleStartDate],
        RankWorld = a[Constants.FieldNames.World],
        RankEurope = a[Constants.FieldNames.RankEurope],
        RankAfrica = a[Constants.FieldNames.RankAfrica],
        RankAmerica = a[Constants.FieldNames.RankAmerica],
        RankAsia = a[Constants.FieldNames.RankAsia],
        RankPacific = a[Constants.FieldNames.RankPacific],
    });

    rptArticles.DataSource = result.OrderBy(a => a.RankWorld);
    rptArticles.DataBind();
该代码将所有排名设置为RankWorld(1-6)的任意值

如果字符串
officeLocation
(传递给方法)是Europe,那么我想按
a.RankEurope
订购,如果officeLocation是Asia order by
a.RankAsia
,依此类推

如何才能最好地实现这一点(.NET 3.5)


提前感谢。

假设您有一组固定的位置(根据定义,您必须在匿名类型中声明这些位置),那么您可以使用一个开关:

string officeLocation = "";
// office location could be either World, Europe, Africa, America, Asia, Pacific

var result = articles.Select(a => new
{
    Title = a.Title,
    Url = a[SPBuiltInFieldId.FileRef],
    Byline = a[Constants.FieldNames.Byline],
    ArticleDate = a[Constants.FieldNames.ArticleStartDate],
    RankWorld = a[Constants.FieldNames.World],
    RankEurope = a[Constants.FieldNames.RankEurope],
    RankAfrica = a[Constants.FieldNames.RankAfrica],
    RankAmerica = a[Constants.FieldNames.RankAmerica],
    RankAsia = a[Constants.FieldNames.RankAsia],
    RankPacific = a[Constants.FieldNames.RankPacific],
});

switch (officeLocation)
{
    case "World": result = result.OrderBy(a => a.RankWorld); break;
    case "Europe": result = result.OrderBy(a => a.RankEurope); break;
    case "Africa": result = result.OrderBy(a => a.RankAfrica); break;
    case "America": result = result.OrderBy(a => a.RankAmerica); break;
    case "Asia": result = result.OrderBy(a => a.RankAsia); break;
    case "Pacific": result = result.OrderBy(a => a.RankPacific); break;
    default: throw new Exception("Unexpected location: " + officeLocation);
}

rptArticles.DataSource = result.OrderBy(a => a.RankWorld);
rptArticles.DataBind();
显然,您需要决定如何最好地处理意外位置

请注意,理想情况下,我会将
OrderBy
函数分配给
Func
,但只有一个
OrderBy
调用,但由于匿名类型,您无法在此处执行此操作