Может ли ICriteria вернуть IDictionary вместо List <DTO>? - PullRequest
4 голосов
/ 12 августа 2010

В настоящее время я могу получить этот SetResultTransformer метод для возврата списка некоторого произвольного вида DTO следующим образом:

var result = _session.CreateCriteria<Company>()
    .Add(Restrictions.In(groupCompanyInfo, (int[])groups.Select(xx => xx.Id).ToArray()))
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.GroupProperty(groupCompanyInfo), "CompanyInfoGroupID")
        .Add(Projections.RowCount(), "TotalNumberOfCompanies"))
    .SetResultTransformer(Transformers.AliasToBean<SomeDTO>())
    .List<SomeDTO>();

где SomeDTO определяется как:

public class SomeDTO
{
    public int GroupId { get; set; }
    public int CountOfCompaniesInGroup { get; set; }
}

Я думаю, это немного излишне - создавать тип, специально предназначенный для извлечения данных из этого запроса. В идеале я мог бы использовать IDictionary<int,int>, потому что встроен в фреймворк. Несмотря на то, что, похоже, я могу вернуть список.

Я думал, что смогу бросить подлого KeyValuePair<int,int> в SetResultsTransformer, вот так:

var result = _session.CreateCriteria<Company>()
    .Add(Restrictions.In(groupCompanyInfo, (int[])groups.Select(xx => xx.Id).ToArray()))
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.GroupProperty(groupCompanyInfo))
        .Add(Projections.RowCount())) // note, I removed the aliases
    .SetResultTransformer(Transformers.AliasToBean<KeyValuePair<int, int>>())
    .List<KeyValuePair<int, int>>();

, но result - это просто пустая KeyValuePair. Есть ли для меня способ сделать это, или мне нужен DTO?

Ответы [ 2 ]

5 голосов
/ 12 августа 2010

Используйте проекцию Linq на стороне клиента. Я делаю это все время:

var result = _session.CreateCriteria...
             .List<object[]>
             .ToDictionary(x => (int)x[0], x => (int)x[1]);
0 голосов
/ 05 марта 2011
var result = _session.CreateCriteria<Company>()
    .Add(Restrictions.In(groupCompanyInfo, (int[])groups.Select(xx => xx.Id).ToArray()))
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.GroupProperty(groupCompanyInfo))
        .Add(Projections.RowCount())) // note, I removed the aliases
    .List();

Это должно вернуть IList<object[]>:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...