C# Linq中实体框架模型到Dto的转换
我在使用以下代码将实体框架6模型转换为Dto时遇到问题。在阅读一篇文章之后,我多次使用这种将实体转换为DTO的方法 . 昨晚代码正常工作,所以今天早上对模型的更改可能影响了代码 请注意,C# Linq中实体框架模型到Dto的转换,c#,.net,entity-framework,linq-to-entities,dto,C#,.net,Entity Framework,Linq To Entities,Dto,我在使用以下代码将实体框架6模型转换为Dto时遇到问题。在阅读一篇文章之后,我多次使用这种将实体转换为DTO的方法 . 昨晚代码正常工作,所以今天早上对模型的更改可能影响了代码 请注意,layoutTransator对象是从Unity IoC容器中正确加载的 我已经复习了,但它并没有真正涵盖我的问题 实体模型 private readonly PortalEntities ctx; private readonly IEntityDtoTranlator<Layout, L
layoutTransator
对象是从Unity IoC容器中正确加载的
我已经复习了,但它并没有真正涵盖我的问题
实体模型
private readonly PortalEntities ctx;
private readonly IEntityDtoTranlator<Layout, LayoutsDto> layoutTranslator;
[InjectionConstructor]
public Dal(IContextFactory<JcbManufacturingPortalEntities> factory,
IEntityDtoTranlator<Layout, LayoutsDto> layoutTransator))
{
ctx = factory.Create(ConfigurationManager.ConnectionStrings[EntityConnection].ConnectionString, EntityPassword);
this.layoutTranslator = layoutTransator;
}
public List<LayoutsDto> GetDiplayLayouts(string machineAssetName)
{
try
{
return (ctx.Layouts.Where(m => m.Hardware.AssetName.Equals(machineAssetName))
.Select(l => layoutTranslator.TranslatetoDto(l))).ToList();
}
catch (Exception ex)
{
throw;
}
}
加载实体框架模型
private readonly PortalEntities ctx;
private readonly IEntityDtoTranlator<Layout, LayoutsDto> layoutTranslator;
[InjectionConstructor]
public Dal(IContextFactory<JcbManufacturingPortalEntities> factory,
IEntityDtoTranlator<Layout, LayoutsDto> layoutTransator))
{
ctx = factory.Create(ConfigurationManager.ConnectionStrings[EntityConnection].ConnectionString, EntityPassword);
this.layoutTranslator = layoutTransator;
}
public List<LayoutsDto> GetDiplayLayouts(string machineAssetName)
{
try
{
return (ctx.Layouts.Where(m => m.Hardware.AssetName.Equals(machineAssetName))
.Select(l => layoutTranslator.TranslatetoDto(l))).ToList();
}
catch (Exception ex)
{
throw;
}
}
您只需要更改调用
TranslateDto
方法的上下文。目前,您正在告诉L2E这个方法将在DB端运行,但是,您的方法不可翻译为SQL,因此不能以这种方式执行
您需要强制查询在客户机上执行该方法,要做到这一点,您需要将查询从L2E切换到LINQ,再切换到对象,即
return (ctx.Layouts.Where(m => m.Hardware.AssetName.Equals(machineAssetName))
.AsEnumerable() // <-- Here's the switch
.Select(l => layoutTranslator.TranslatetoDto(l)));
return(ctx.Layouts.Where(m=>m.Hardware.AssetName.Equals(machineAssetName))
.AsEnumerable()//谢谢詹姆斯。这帮我解决了这个问题。我不知道它以前是怎么工作的。@PhilMurray不用担心,也许你之前打过电话给ToList
,这意味着该收藏已经从数据库中删除了?可能。不记得了,我做了之后就睡着了:-)
internal class LayoutTranslator<TEntity, TDto> : IEntityDtoTranlator<Layout, LayoutsDto>
{
public LayoutsDto TranslatetoDto(Layout entity)
{
return new LayoutsDto
{
Duration = entity.DisplayDuration,
FlipOrder = entity.FlipOrder,
ID = entity.ID,
OutOfShift = entity.IsOutOfShiftScreen
};
}
public Layout TranslateToEntity(LayoutsDto dto)
{
return new Layout
{
DisplayDuration = dto.Duration,
FlipOrder = dto.FlipOrder,
ID = dto.ID,
IsOutOfShiftScreen = dto.OutOfShift
};
}
}
LINQ to Entities does not recognize the method 'Jmp.Andon.Models.LayoutsDto TranslatetoDto(Jmp.Andon.Service.Data.Layout)' method, and this method cannot be translated into a store expression.
at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input)
at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding)
at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)
at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SelectTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.Convert()
at System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClassb.<GetResults>b__a()
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClassb.<GetResults>b__9()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
at System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0()
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at System.Lazy`1.get_Value()
at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Jmp.Andon.Service.Data.Dal.GetDiplayLayouts(String machineAssetName) in c:\Perforce\Development\JMP v2\Jmp.Display\Jmp.Display.Service\Data\Dal.cs:line 38
return (ctx.Layouts.Where(m => m.Hardware.AssetName.Equals(machineAssetName))
.AsEnumerable() // <-- Here's the switch
.Select(l => layoutTranslator.TranslatetoDto(l)));