C# 在asp.net mvc中使用IQueryable仅选择特定列

C# 在asp.net mvc中使用IQueryable仅选择特定列,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我对asp.NETMVC有点陌生。我目前正在处理由另一个人开发的代码,这些代码已经走到了死胡同 IQueryable<DatatableTrainingHistory> trainingView = (from b in db.DatatableTrainingHistorys select b); /* Returns the format needed to output

我对asp.NETMVC有点陌生。我目前正在处理由另一个人开发的代码,这些代码已经走到了死胡同

IQueryable<DatatableTrainingHistory> trainingView = (from b in db.DatatableTrainingHistorys
                                                     select b);

/* Returns the format needed to output DataTable extension */
return DataTablesResult.Create(trainingView, dataTableParam, uv => new
{
      //stuff runs here
});
上面的代码输出一个错误:

The entity or complex type 'AppModel.DatatableTrainingHistory' cannot be constructed in a LINQ to Entities query.
(二)

IQueryable trainingView=(来自db.DatatableTrainingHistorys中的b
选择新的
{
TrainingName=b.TrainingName,
培训时间=b.培训时间,
配额=b.配额,
位置=b.位置,
}).AsQueryable();
上面的代码显示一个错误,说明:

Cannot implicitly convert type 'System.Linq.IQueryable<AnonymousType#1>' to 'System.Linq.IQueryable<Project.Models.DatatableTrainingHistory>'. An explicit conversion exists (are you missing a cast?)
无法将类型“System.Linq.IQueryable”隐式转换为“System.Linq.IQueryable”。存在显式转换(是否缺少强制转换?)
谁能帮我指一下正确的方向吗?谢谢。

(1)
DatatableTrainingHistory
是一个实体对象,不能在LINQ查询中使用实体对象

(2) 。您返回的是
匿名对象
,因此应该对其使用
var

var trainingView = (from b in db.DatatableTrainingHistorys
                                                    select new
                                                    {
                                                        TrainingName = b.TrainingName,
                                                        TrainingTime = b.TrainingTime,
                                                        Quota = b.Quota,
                                                        Location = b.Location,
                                                    }).AsQueryable();
有两种可能的解决方案:

  • 使用匿名对象(作为问题的第(2)点)
  • 引入新的数据传输对象
这两种方法都有优点和缺点,第二种解决方案需要更多的努力,但它会使您的strong type=>错误更少。有两个库可以自动为您进行对象映射(例如:
AutoMapper
),也许您可以尝试一下

干杯。

(1)
DatatableTrainingHistory
是一个实体对象,不能在LINQ查询中使用实体对象

(2) 。您返回的是
匿名对象
,因此应该对其使用
var

var trainingView = (from b in db.DatatableTrainingHistorys
                                                    select new
                                                    {
                                                        TrainingName = b.TrainingName,
                                                        TrainingTime = b.TrainingTime,
                                                        Quota = b.Quota,
                                                        Location = b.Location,
                                                    }).AsQueryable();
有两种可能的解决方案:

  • 使用匿名对象(作为问题的第(2)点)
  • 引入新的数据传输对象
这两种方法都有优点和缺点,第二种解决方案需要更多的努力,但它会使您的strong type=>错误更少。有两个库可以自动为您进行对象映射(例如:
AutoMapper
),也许您可以尝试一下


干杯。

不幸的是,将类型更改为var仍然会导致
无法将类型“System.Linq.IQueryable”隐式转换为“System.Linq.IQueryable”。存在显式转换(是否缺少转换?
)。我将尝试阅读更多关于DTO的内容。@BaskoroS。我认为异常是在其他地方抛出的,您的代码看起来非常好(我测试过),不幸的是,将类型更改为var仍然会使我
无法隐式地将类型“System.Linq.IQueryable”转换为“System.Linq.IQueryable”。存在显式转换(是否缺少转换?
)。我将尝试阅读更多关于DTO的内容。@BaskoroS。我认为异常被抛出到其他地方,您的代码看起来完全正常(我测试过)
var trainingView = (from b in db.DatatableTrainingHistorys
                                                    select new
                                                    {
                                                        TrainingName = b.TrainingName,
                                                        TrainingTime = b.TrainingTime,
                                                        Quota = b.Quota,
                                                        Location = b.Location,
                                                    }).AsQueryable();