0

Given the following expression, how do I go about getting a distinct list of venues, without getting that nasty "Expression type 'NhDistinctExpression' is not supported by this SelectClauseVisitor." error?

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

I've tried setting

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

as distinct by doing:

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

but that throws the error. I also tried surrounding the entire query syntax statement in parens, and putting a .Distinct() at the end of it, but that also resulted in the same error.

4

1 回答 1

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 注入了不同的场所。

于 2015-03-04T18:24:51.227 回答