Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq中实体框架模型到Dto的转换_C#_.net_Entity Framework_Linq To Entities_Dto - Fatal编程技术网

C# Linq中实体框架模型到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

我在使用以下代码将实体框架6模型转换为Dto时遇到问题。在阅读一篇文章之后,我多次使用这种将实体转换为DTO的方法 . 昨晚代码正常工作,所以今天早上对模型的更改可能影响了代码

请注意,
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)));