2011-07-02 53 views
1

我想排序关键字的排序属性。 我在页面 - >关键字之间有一对多的关系。Linq对实体使用一对多关系和排序

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

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); 
    } 

但是,这并没有奏效。关键字没有按排序排序?上面的代码确实有效,但是我需要按排序属性对关键字进行排序。关键字集合未被排序。

我也试过:

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

,没有工作。

我试着去了解,但我错过了什么?任何建议都是可观的。

enter image description here

回答

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) 
       }; 
+0

哇!很好的在查询中创建对象。在我的学习中帮助了很多。想知道,而不是使用var,将返回什么样的数据类型。我的猜测是,数据类型是一个新的PageKeywords对象,还是IEnumerable ?甜蜜的代码,节省了很多线条。 – deDogs

+0

数据类型是'IQueryable '。 –

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而不是驼峰)。

+0

想知道.OrderBy(p.Keywords.Select(关键字=> keyword.sort).Min());是不是不在范围内?我上面的代码不正确。我知道OrderBy返回一个新的枚举,那么这应该工作:pageKeywords.keywords = pge.keywords.OrderBy(k => k.sort);我更正了上面的代码。 – deDogs

+0

我想返回匹配页面ID的关键字集合。我没有一个关键字。我想要一个集合? – deDogs

相关问题