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

时间:2016-02-01 08:07:21

标签: c# asp.net asp.net-mvc

我是asp.net mvc的新手。我目前正在使用由另一个人开发的代码并且已经走到了死胡同。

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
});

此代码的作用是从表中的所有列中选择数据。我目前需要的是让代码选择特定列,让我们说TrainingNameTrainingTimeLocationQuota。输出必须是IQueryable类型,因为代码使用this扩展名来输出数据。

我尝试了很多方法来解决这个问题。

(1)

IQueryable<DatatableTrainingHistory> trainingView = (from b in db.DatatableTrainingHistorys
                                                    select new DatatableTrainingHistory
                                                    {
                                                        TrainingName = b.TrainingName,
                                                        TrainingTime = b.TrainingTime,
                                                        Quota = b.Quota,
                                                        Location = b.Location,
                                                    });

上面的代码输出错误:

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

(2)

IQueryable<DatatableTrainingHistory> trainingView = (from b in db.DatatableTrainingHistorys
                                                    select new
                                                    {
                                                        TrainingName = b.TrainingName,
                                                        TrainingTime = b.TrainingTime,
                                                        Quota = b.Quota,
                                                        Location = b.Location,
                                                    }).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?)

有人可以指出我正确的方向吗?谢谢。

1 个答案:

答案 0 :(得分:0)

(1)。 DatatableTrainingHistory是一个实体对象,你根本无法在LINQ查询中使用实体对象。

(2)。您正在返回anonymous object,因此您应该使用var

var trainingView = (from b in db.DatatableTrainingHistorys
                                                    select new
                                                    {
                                                        TrainingName = b.TrainingName,
                                                        TrainingTime = b.TrainingTime,
                                                        Quota = b.Quota,
                                                        Location = b.Location,
                                                    }).AsQueryable();

有两种可能的解决方案:

  • 使用匿名对象(如问题中的第(2)点)
  • 介绍新的数据传输对象

他们都有专业缺点,第二种解决方案需要更多的努力,但它会给你强烈的类型=&gt;减少错误。有几个库可以自动为你做对象映射(例如:AutoMapper),也许你可以尝试一下。

干杯。