如何将此linq查询转换为微风查询

时间:2013-09-16 22:30:50

标签: breeze

我正在学习Durandal和Breeze。并选择创建一个SPA版本的nerddinner。

我需要执行的第一个查询是:

 public IEnumerable<JsonDinner> GetMostPopularDinners(int limit = 10)
    {
       var mostPopularDinners = from dinner in _db.Context.Dinners.Include("RSVPs")
                                where dinner.EventDate >= DateTime.Now
                                orderby dinner.RSVPs.Count descending
                                select dinner;

        if (limit > 50 || limit <= 0)
            limit = 10;

        return mostPopularDinners.Take(limit).AsEnumerable().Select(JsonDinnerFromDinner);
    }

我已经开始用微风来写它但是我遇到了这条线“按晚餐排序.RSVPs.Count下降”的麻烦这是我到目前为止所做的。

var getMostPopularDinners = function() {
        var query = EntityQuery
            .from('dinners')
            .where('eventDate', '>=', new Date(Date.now()))
            .orderByDesc('RSVPs')
            .expand('RSVPs');

1 个答案:

答案 0 :(得分:1)

抱歉,Breeze还不支持对聚合值进行排序或过滤(在这种情况下为'count')。

您可以做的是将其转换为命名查询。 (没有详细记录......)基本上这涉及使用 EntityQuery.withParameters 方法将其他参数传递给任何服务方法。因此,您可以构建如下所示的查询,它们都传递参数并仍然使用Breeze的IQueryable支持。

EntityQuery.from("GetMostPopularDinners")
             .withParameters({ EventDate: new Date(Date(now()) })
             .take(10);

你的控制器方法看起来像这样:

[HttpGet]
public IQueryable<Dinner> GetMostPopularDinners(DateTime eventDate) {
      return _db.Context.Dinners.
         .Where(dinner => dinner.EventDate >= eventDate)
         .OrderByDescending(dinner => dinner.RSVPs.Count);
}

和...你不应该做一个JsonDinnerFromDinner“调用; Breeze会自动处理这个。