1

asp.net mvc 4、实体框架 5、SQL Server 2012 Express、代码优先

我有一个地方模型:

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

和相关的标签模型:

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可以做到吗?

谢谢。

4

2 回答 2

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 对那里使用的所有东西的支持。

于 2013-06-07T07:56:38.433 回答
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>
   }
}
于 2013-06-07T11:28:35.730 回答