Linqtosql - возвращение пользовательского класса с интерфейсом - PullRequest
0 голосов
/ 13 ноября 2009

Почему я не могу вернуться как новый пользовательский класс (cms.bo.Site), который реализует ISite?

public IQueryable<ISite> GetSites()
{
    return (from site in Db.Sites select new cms.bo.Site(site.id, site.name));
}

Ответы [ 2 ]

4 голосов
/ 13 ноября 2009

В основном LINQ to SQL не знает, что будет делать этот конструктор - он хочет попытаться преобразовать это в SQL-запрос, но не знает как. Нужно ли вам добавить дополнительные биты к запросу впоследствии? Если нет, вы можете сделать:

public IEnumerable<ISite> GetSites()
{
    return Db.Sites.Select(x => new { x.id, x.name }) // Project in SQL
                   .AsEnumerable() // Do the rest in process
                   .Select(x => new cms.bo.Site(x.id, x.name))
                   .Cast<ISite>(); // Workaround for lack of covariance
}

РЕДАКТИРОВАТЬ: я пропустил аспект отклонения, и предполагал, что запрос не выполнялся во время выполнения. Определенно стоит попробовать просто позвонить на Cast<ISite>() согласно ответу tvanfosson - но если это не сработает, попробуйте выше:)

3 голосов
/ 13 ноября 2009

Попробуйте это:

    return Db.Sites
             .ToList()
             .Select( s => new cms.bo.Site( s.id, s.name ) )
             .Cast<ISite>()
             .AsQueryable();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...