我正在尝试将数据从我的 SQL Server 2008 数据库加载到服务器端 DTO 以传输到客户端,并且想知道如何加载父实体和子实体的集合。
您可以从模型中看到我正在尝试加载所有用户以及在 tblUsermmRole 表中加入的相关 UserRoles。
当我运行 Linq 查询加载子实体时崩溃,因为查询无法将单个实例加载到集合中。
我可以在单个查询中加载这些实体,还是应该将用户加载到集合中然后迭代地构建子 AccessRoles?
模型
数据传输对象
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