无法将 LINQ 映射到实体

Cannot map LINQ to Entities

我不太清楚编写 linq 查询。我使用 linq lambda 表达式仅向 table 中的某些列写入查询 select,但我收到无法将 linq 构造为实体的错误。当我使用 linq 向 select 所有列编写相同的查询时,我没有收到任何错误并且我得到了所有列,稍后我在视图中过滤掉了这些列。但我只想将 lambda 用于 select 某些列。

代码片段:

视图模型:

public class StaggingInternalCashExceptionViewModel
    {



        public OutputCash OutputCash { get; set; } 
        public IEnumerable<StaggingInternalException> StaggingInternalException { get; set; }
        //list of results of Stagginginternalcashexception
    }

控制器:

 public ActionResult Exceptionstest(string dd1, string dd2, string dd3)
{
     StaggingInternalExceptionViewModel _app = new StaggingInternalExceptionViewModel();

_app.StaggingInternalException = db2.StaggingInternalExceptions.Where(x => x.Level1 == dd1 && x.Level2 == dd2 ).Select(i => new StaggingInternalException
         {


             StaggingInternalRowID = i.StaggingInternalRowID,
             Category = i.Category,
             EnterText1 = i.EnterText1,
             InternalAmount = i.InternalAmount,
             ExternalAmount = i.ExternalAmount

         });

  _app.StaggingInternalException = (from p in db2.StaggingInternalExceptions 
                                                 where p.LoadID==loadid && p.Level1 == dd1 && p.Level2 == dd2   select p);
}

在上面的代码中,当我尝试 select 仅来自 table 的某些列时,lambda 表达式会抛出一个错误,或者如果我们在实体方面说话 类,只有某些属性。但是查询了returns所有的列。我应该使用 DTOS 吗?我不确定数据传输对象的用途是什么。对此的一些解释会很好。谢谢

您需要使用 DTO。 dto 只是您将结果映射到的对象。在您的情况下,它将是

public class StaggingInternalExceptionViewModel
{
     public int StaggingInternalRowID { get; set; }
     public int Category { get; set; }
     ... //rest of properties
}

您需要更改 StaggingInternalCashExceptionViewModel 以使用 StaggingInternalException DTO

public class StaggingInternalCashExceptionViewModel
{
    public OutputCash OutputCash { get; set; } 
    public IEnumerable<StaggingInternalExceptionViewModel> StaggingInternalException { get; set; }
    //list of results of Stagginginternalcashexception
}

然后你的表达基本保持不变,但你 select 一个新的 StaggingInternalExceptionViewModel 而不是 StaggingInternalException

StaggingInternalExceptionViewModel _app = new StaggingInternalCashExceptionViewModel();

_app.StaggingInternalException = db2.StaggingInternalExceptions.Where(x => x.Level1 == dd1 && x.Level2 == dd2 ).Select(i => new StaggingInternalExceptionViewModel
     {
         StaggingInternalRowID = i.StaggingInternalRowID,
         Category = i.Category,
         EnterText1 = i.EnterText1,
         InternalAmount = i.InternalAmount,
         ExternalAmount = i.ExternalAmount
     });

Linq to Entities 不允许您使用实体类型设计查询,因为您最终可能会在部分加载实体并稍后尝试将该实体保存到您的数据库时丢失信息。因此,当您需要实体的部分信息时,无论是否使用 DTO or an anonymous type.

,您都必须设计您的查询

如果你需要使用实体类型,那么就不要使用Select方法进行投影,唯一的事情就是你要加载所有的属性,但我认为情况并非如此,因为您不需要所有数据 ;)。