linq2sql: явное построение типа сущности '#some type #' в запросе не допускается - также используется соединение - PullRequest
0 голосов
/ 22 сентября 2009

У меня проблема с отображением. Я читал пост scottGU "Особенности формирования данных" - http://weblogs.asp.net/scottgu/archive/2007/06/29/linq-to-sql-part-3-querying-our-database.aspx

но я попробовал это

      IQueryable<AccessRights> accessRights = 
                            from t1 in this.db.AccessRights
                            join t2 in this.db.AccessRightsExtra
                            on t1.IdAccessRights equals t2.IdAccessRights 
                            where t2.IdUser== userId
                            select new AccessRights
                            {
                                IdAccessRights = t1.IdAccessRights,
                                Description= t2.Description
                            };

но выдает эту ошибку "Явное построение типа сущности '#some type #' в запросе не разрешено"

Согласно сообщению Скоттгуса в ссылке выше, я также пытался (заметьте, что пропущен тип после нового в избранном)

     IQueryable<AccessRights> accessRights = 
                            from t1 in this.db.AccessRights
                            join t2 in this.db.AccessRightsExtra
                            on t1.IdAccessRights equals t2.IdAccessRights 
                            where t2.IdUser== userId
                            select new
                            {
                                IdAccessRights = t1.IdAccessRights,
                                Description= t2.Description
                            };

но это производит

Невозможно неявно преобразовать тип 'System.Linq.IQueryable' в 'System.Linq.IQueryable'. Существует явное преобразование (вам не хватает приведения?)

Действительно ценю любое понимание, которое есть у каждого.

Ответы [ 2 ]

4 голосов
/ 22 сентября 2009

Как насчет:

 IEnumerable<AccessRights> accessRights = 
    // This bit works in the database
    (from t1 in this.db.AccessRights
    join t2 in this.db.AccessRightsExtra
    on t1.IdAccessRights equals t2.IdAccessRights 
    where t2.IdUser== userId
    select new
    {
        IdAccessRights = t1.IdAccessRights,
        Description= t2.Description
    })
    .AsEnumerable() // From here on it's in-process
    .Select(x => new AccessRights
            {
                IdAccessRights = x.IdAccessRights,
                Description= x.Description
            });

Обратите внимание, что результатом будет IEnumerable<T>, а не IQueryable<T>, но оно все равно будет лениво оцениваться. Это вызовет проблему?

Либо просто используйте анонимный тип, используя неявно типизированную локальную переменную:

var accessRights = from t1 in this.db.AccessRights
                   join t2 in this.db.AccessRightsExtra
                   on t1.IdAccessRights equals t2.IdAccessRights 
                   where t2.IdUser== userId
                   select new
                   {
                       IdAccessRights = t1.IdAccessRights,
                       Description= t2.Description
                   };

Это по-прежнему будет IQueryable<T>, но T - это анонимный тип. Вы не сможете использовать это как IQueryable<AccessRights>, но если все, что вам нужно, это свойства IdAccessRights и Description, и они нужны вам только одним и тем же способом, это может быть достаточно для вас ...

0 голосов
/ 17 октября 2013

Это возможно, если вы создадите новый производный класс без атрибута [Table], например:

public class AccessRightsLocal : AccessRights
{
}

Затем вы можете создать экземпляр «AccessRightsLocal» внутри выбора. Приведите новый экземпляр к «AccessRights», и он будет работать!

IQueryable<AccessRights> accessRights = 
                    from t1 in this.db.AccessRights
                    join t2 in this.db.AccessRightsExtra
                    on t1.IdAccessRights equals t2.IdAccessRights 
                    where t2.IdUser== userId
                    select (AccessRights) new AccessRightsLocal
                    {
                        IdAccessRights = t1.IdAccessRights,
                        Description= t2.Description
                    };
...