Linq-to-Entities使用一对多关系和排序

时间:2011-07-02 19:20:11

标签: linq linq-to-entities

我想按排序属性对关键字进行排序。 我在页面之间有一对多的关系 - >关键字。

问题:如果我执行理解查询:

IEnumerable<page> query = from p in contxt.pages where p.ID == myId select p;

IEnumerable<page> pge = query.First();

我可以期待单页记录集包含所有页面属性和一个关键字集合吗?

我的理解是因为存在一对多的关系,所以我不必进行连接。 Linq to Entity框架应该知道这种关系,并返回一个集合。

所以这是我的理解,所以当我尝试对keyword.sort进行排序时,关键字超出了范围:

    IEnumerable<page> query = from p in contxt.pages where p.ID == myId
orderby p.keywords. select p;

利用上述理解,我认为查询不正确,因为关键字作为集合返回,所以我必须按如下方式执行排序:

    PageKeywords pageKeywords = new PageKeywords();
    Keywords keywords;

    IEnumerable<page> query = from p in contxt.pages 
where p.ID == vals.pageId select p;

    page pge = query.First();

    pageKeywords.keywords = new List<Keywords>();

    pageKeywords.id = pge.ID;
    pageKeywords.description = pge.descp;
    pageKeywords.title = pge.title;
    pageKeywords.showTitle = pge.showTitle;
    pageKeywords.keywords = pge.keywords.OrderBy(k => k.sort);

    foreach (var item in pageKeywords.keywords)
    {
    keywords = new Keywords();
    keywords.id = item.id;
    keywords.name = item.name;
    keywords.sort = item.sort;
    pageKeywords.keywords.Add(keywords);
    }

然而这不起作用。关键字没有按排序排序?上面的代码确实有效,但是我需要按sort属性对关键字进行排序。关键字集合未进行排序。

我也尝试过:

pageKeywords.keywords.Sort((x, y) => int.Compare(x.sort, y.sort));

哪个不起作用。

我试过了解,但我错过了什么?任何建议都会很明显。

enter image description here

2 个答案:

答案 0 :(得分:2)

试试这个:

var query = from p in contxt.Pages 
            where p.ID == vals.PageId 
            select new PageKeywords 
                {
                    Id = pge.Id,
                    Description = pge.Descp,
                    Title = pge.Title,
                    ShowTitle = pge.ShowTitle,
                    Keywords = pge.Keywords.OrderBy(k => k.sort)
                };

答案 1 :(得分:0)

OrberBy返回一个新的枚举 - 它不会更改源:http://msdn.microsoft.com/en-us/library/bb534966.aspx

此外,您希望按关键字的属性进行排序,页面可能包含许多关键字,您需要选择一个(例如最少一个)。

尝试:

IEnumerable<page> query = context.pages // Pages
    .Where(p => p.ID == myId) // Filtered by id
     // Sort by minimum sort value of all keywords of page
    .OrderBy(p.Keywords.Select(keyword => keyword.sort).Min());

另外,建议使用.NET的名称指南(例如,属性应该是PascalCase而不是camelCase)。