Linq to Entities - OrderBy标签(多对多关系)

时间:2013-06-07 06:27:00

标签: asp.net asp.net-mvc linq asp.net-mvc-4 linq-to-entities

asp.net mvc 4,Entity Framework 5,SQL Server 2012 Express,Code First

我有一个Place模型:

public virtual int PlaceID { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
public virtual string Name { get; set; }

和相关的Tag模型:

public virtual int TagID { get; set; }
public virtual string Name { get; set; }
public virtual string NamePlural { get; set; }
public virtual ICollection<Place> Places { get; set; }
他们有很多关系。

我选择了标有'餐厅'的所有地方:

 List<Place> Restaurants = allPlaces.Where(
    p => p.Tags.Any(
       t => t.Name == "Restaurant")).OrderBy(p => p.Name).ToList();

我想通过有序标签显示它 - 然后按名称排序。

让我们说有5个地方:

My Cafe Bar, Tags="Restaurant", "Cafe", "Bar"
Another Cafe, Tags="Restaurant", "Cafe"
Marios Italian, Tags="Restaurant", "Italian", "Bar"
Donnies Pizzaria, Tags="Restaurant", "Italian"
A1 Chinese, Tags="Restaurant", "Chinese"
Fusion One, Tags="Restaurant", "Chinese", "Italian"
China Garden, Tags="Restaurant", "Chinese"

我想按以下顺序输出(因为它们都是餐厅,不需要输出餐馆组):

>>Bars
Marios Italian
My Cafe Bar

>>Cafes
Another Cafe
My Cafe Bar

>>Chinese
A1 Chinese
Fusion One
China Garden

>>Italian
Donnies Pizzaria
Fusion One
Marios Pizzaria

在我看来,我想按照上面的标题显示它们。

Linq可以实现吗?

感谢。

2 个答案:

答案 0 :(得分:2)

看起来您正在寻找GroupBy,而不是OrderBy。检查此查询:

var restaurants = allPlaces.Where(p => p.Tags.Any(t => t.Name == "Restaurant"))
                           .SelectMany(p => p.Tags, (p, t) => new { Tag = t.Name, Name = p.Name })
                           .GroupBy(i => i.Tag)
                           .Where(g => g.Key != "Restaurant")
                           .Select(g => new { Tag = g.Key, Places = g })
                           .ToList();

它将生成一个包含两个属性的匿名对象列表:

{
    public string Tag { get; set; }
    public List<string> Places { get; set;}
}

我非常确定这里的逻辑,但不是LINQ to Entities支持那里使用的所有东西。

答案 1 :(得分:0)

我最后以不同的方式看待这个。

我只是将所有标记传递给视图(按字母顺序排序) - 然后循环遍历这些标记。循环遍历每个标记时,我遍历其中的每个位置(导航属性)。

解决问题的非常简单的方法:

@foreach (var t in Model)
{
   <h2>@t.Name</h2>

   foreach (var p in t.Places)
   {
       <li>@Html.ActionLink(p.Name, "Details", new { URL = p.URL })</li>
   }
}