2013-09-02 3 views
0

Я пытаюсь загрузить данные из базы данных SQL Server 2008 в DTO на стороне сервера для передачи клиенту и задался вопросом, как загружать коллекции родительских и дочерних объектов.Linq: загрузить родительские и дочерние объекты

Вы можете видеть из модели, что я пытаюсь загрузить всех пользователей и связанных UserRoles, которые объединены в таблице tblUsermmRole.

Когда я запускаю запрос Linq для разбивки при загрузке дочерних объектов, поскольку запрос не может загрузить один экземпляр в коллекцию.

Могу ли я загрузить эти объекты в одном запросе или загрузить пользователей в коллекцию, а затем создать дочерние AccessRoles итеративно?

Модель

enter image description here

Передача данных объекта

Public Class User 

    Public Property ID As Int32 
    Public Property Username As String 
    Public Property Password As String 
    Public Property AccessRoles As IList(Of UserRoles) 

End Class 

Public Class UserRoles 
    Public Property Role As ApplicationRole 
End Class 

Public Class ApplicationRole 

    Public Property ID As Int32 
    Public Property Description As String 

End Class 

загрузки данных

Dim var = (From usr In ctx.tblUsers.OrderBy(Function(w) w.username) 
       Join useraccess In ctx.tblUsermmRoles On usr.idUser Equals useraccess.idUser 
       Join role In ctx.tblUserRoles On role.idRole Equals useraccess.idRole 
       Select New User With {.ID = usr.idUser, 
             .Username = usr.username, 
             .Password = usr.pwd, 
             .AccessRoles = New ApplicationRole With {.ID = role.idRole, 
                       .Description = role.description}}).ToList 

Исключение Сообщение

{"Unable to cast the type 'Epms.Ui.Models.ApplicationRole' to type 'System.Collections.Generic.IList`1'. LINQ to Entities only supports casting EDM primitive or enumeration types."} 

Трассировка стека

at System.Data.Objects.ELinq.ExpressionConverter.ValidateAndAdjustCastTypes(TypeUsage toType, TypeUsage fromType, Type toClrType, Type fromClrType) 
    at System.Data.Objects.ELinq.ExpressionConverter.GetCastTargetType(TypeUsage fromType, Type toClrType, Type fromClrType, Boolean preserveCastForDateTime) 
    at System.Data.Objects.ELinq.ExpressionConverter.CreateCastExpression(DbExpression source, Type toClrType, Type fromClrType) 
    at System.Data.Objects.ELinq.ExpressionConverter.ConvertTranslator.TranslateUnary(ExpressionConverter parent, UnaryExpression unary, DbExpression operand) 
    at System.Data.Objects.ELinq.ExpressionConverter.UnaryTranslator.TypedTranslate(ExpressionConverter parent, UnaryExpression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.MemberInitTranslator.TypedTranslate(ExpressionConverter parent, MemberInitExpression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.JoinTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.Convert() 
    at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption) 
    at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) 
    at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() 
    at System.Data.Entity.Internal.Linq.InternalQuery`1.GetEnumerator() 
    at System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at Epms.Ui.DataProvider.DataAccess.EntityProvider.GetUsers() in C:\Users\phil.murray\Desktop\Data Provider\Epms.Ui.DataProvider\DataAccess\EntityProvider.vb:line 24 
    at Epms.Ui.DataProvider.DataProvider.VB$StateMachine_0_GetUsers.MoveNext() in C:\Users\phil.murray\Desktop\Data Provider\Epms.Ui.DataProvider\DataProvider.vb:line 27 
+0

Мой VB не очень хорошо, так что это может быть совершенно неправильно синтаксис, но как о чем-то вроде '.AccessRoles = новый список (Of ApplicationRole) от {New ApplicationRole с {.id = role.idRole,. Описание = role.description}} '? –

+0

Это дает мне другое исключение. Невозможно ввести тип «System.Collections.Generic.List'1» для ввода «System.Collections.Generic.IList'1». LINQ to Entities поддерживает только листинг примитивных или перечисляемых типов EDM. –

ответ

0

В конце концов я изменил класс UserRoles держать идентификатор ИНТ значения

Public Class UserRoles 
    Public Property Role As int32 
End Class 

Затем загружают данные через запрос Linq ниже.

Return (From usr In ctx.tblUsers.Include("tblUsermmRoles") 
      Select New User With {.ID = usr.idUser, 
           .Username = usr.username, 
           .Password = usr.pwd, 
           .AccessRoles = usr.tblUsermmRoles.Select(Function(r) r.idRole)}).ToList 
+0

Ваш оригинальный подход был излишне непроницаем (и не смог объяснить «реальность IList»). Приятно, что вы разместили очень правильный код. В любом случае, это не представляет собой точное решение вашего первоначального вопроса (почему я получаю эту ошибку?). Не уверен, почему решение, которое я написал (которое отвечало на ваш первоначальный вопрос), не работало на вашем компьютере; но хорошо ... важно то, что в итоге все сделано правильно. – varocarbas

Смежные вопросы