“SelectClauseVisitor不支持表达式类型'NhDistinctExpression'。” - 使用查询语法

时间:2015-02-23 23:17:42

标签: c# linq-query-syntax

鉴于以下表达方式,我如何获得一个明确的场地列表,而不会让那些令人讨厌的场景类型" NhDistinctExpression'此SelectClauseVisitor不支持。"错误?

    public Dictionary<int, string> GetScheduledVenuesFuture()
    {
        var venues = from v in _sp.CurrentSessionOn(DatabaseName.MyDB).Query<Venue>()
                     join s in _sp.CurrentSessionOn(DatabaseName.MyDB).Query<ScheduledClass>()
                             on v.VenueId equals s.Venue.VenueId
                     where s.CourseDate >= _cac.Now
                             && s.Closed == false
                             && s.Canceled == false

                     select new
                     {
                         v.VenueId,
                         v.Name
                     };

        return venues.ToDictionary(v => v.VenueId, v => v.Name);
    }

我已尝试过设置

        return venues.ToDictionary(v => v.VenueId, v => v.Name);

通过这样做来区分:

        return venues.Distinct().ToDictionary(v => v.VenueId, v => v.Name);

但是会引发错误。我还尝试在parens中包含整个查询语法语句,并在其末尾添加.Distinct(),但这也导致了同样的错误。

1 个答案:

答案 0 :(得分:0)

我用另一种方式解决了这个问题:

    public class ScheduledVenueDTO
    {
        public int VenueId { get; set; }
        public string Name { get; set; }
    }

    public Dictionary<int, string> GetScheduledVenuesFuture()
    {
        var venues = from v in _sp.CurrentSessionOn(DatabaseName.SMS).Query<Venue>()
                     join s in _sp.CurrentSessionOn(DatabaseName.SMS).Query<ScheduledClass>()
                             on v.VenueId equals s.Venue.VenueId
                     where s.CourseDate >= _cac.Now
                             && s.Closed == false
                             && s.Canceled == false
                     select new
                     {
                         v.VenueId,
                         v.Name
                     };

        var svd = venues
            .GroupBy(v => new { v.VenueId, v.Name})
            .Select(v => new ScheduledVenueDTO() {
                VenueId = v.Key.VenueId,
                Name = v.Key.Name
            });

        return svd.ToDictionary(v => v.VenueId, v => v.Name);
    }

我只是创建了一个新的DTO,并且使用groupBy,只为不同的场地注入了DTO。

相关问题