Проекция, выравнивающая структура - PullRequest
0 голосов
/ 23 марта 2012

Я пытаюсь выполнить проекцию с этими двумя классами:

public class SomeClass
{
    public virtual int Id { get; private set; }
    public virtual string Name { get; set; }
    public virtual IList<Language> Languages { get; set; }
}

public class Language
{
     public virtual string Code { get; set; }
}

Отображение выглядит так:

public class SomeClassMapping : ClassMap<SomeClass>
{
    public SomeClassMapping()
    {
        Id(x => x.Id).GeneratedBy.Identity();

        Map(x => x.Name)
            .Length(255)
            .Not.Nullable();

        HasMany(x => x.Languages)
            .KeyColumn("SomeClassId")
            .Table("SomeClassLanguages")
            .Component(x => x.Map(y => y.Code))
            .Cascade.All();
    }    
}

public class LanguageMapping : ComponentMap<Language>
{
    public LanguageMapping()
    {
         Map(x => x.Code);
    }
}

Это класс, который должен содержать результат:

public class SomeClassListItem
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Languages { get; set; }
}

Концептуально, я хочу сделать языковые коды в виде списка через запятую, это выражается ниже в коде:

var items = (from s in _session.Query<SomeClass>()
         orderby s.Name
         select new SomeClassListItem
        {
            Id = s.Id,
            Name = s.Name,
            Languages = s.Languages.Select(x => x.Code).Aggregate((current, language) => current + (language + ", "))
        }).ToList();

Любые предложения о том, как это сделать с помощью LINQ, HQL, ICriteria или другим способом?

1 Ответ

1 голос
/ 23 марта 2012

Я думаю, что ваш концептуальный код должен помочь.Единственное, что вы хотели бы сделать, это с нетерпением получить вашу коллекцию языков, чтобы избежать двух обходов сервера.

var items = _session.Query<SomeClass>().Fetch(s => s.Languages)
                .OrderBy(s => s.Name)
                .Select(s => new SomeClassListItem
                 {
                      Id = s.Id,
                      Name = s.Name,
                      Languages = s.Languages.Select(x => x.Code).Aggregate((current, language) => current + (language + ", "))
                 }).ToList();
...