1

这是我的日程安排课

[Table("Schedules", Schema = "Expedia")]
public  class Schedule
    {

        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int ScheduleId { get; set; }

        [ForeignKey("Inventory")]
        public int FlightId { get; set; }
        public FlightInventory Inventory { get; set; }

        [Display(Name = "Departure city")]
        public string DepartureCity { get; set; }

        [Display(Name = "Arrival city")]
        public string DestiationCity { get; set; }

        [Display(Name = "Departure date")]
        [Required]
        public string DepartureDate { get; set; }

        [Required]
        [Display(Name = "Arrival date")]
        public string ArrivalDate { get; set; }

        [Required]
        [Display(Name = "Departure Time")]
        public string Departure { get; set; }

        [Required]
        [Display(Name = "Arrival Time")]
        public string Arrival { get; set; }

        [Display(Name = "Price/Ticket")]
        public int Price { get; set; }
    }
}

这是我的上下文类

 public class UsersContext : DbContext
 {
     public UsersContext() 
         : base("Expedia") { }

     public DbSet<Schedule> schedules { get; set; }
 }

这是我的函数返回查询结果:

 public dynamic Details(int ScheduleID)
 {
     var query =(from f in db.schedules.Where(f => f.ScheduleId== ScheduleID)
                 select new
                 {
                     f.ScheduleId,
                     f.DepartureDate,
                     f.ArrivalDate,
                     f.Departure,
                     f.Arrival,
                     f.DepartureCity,
                     f.DestiationCity,
                     f.Inventory.provider,
                     f.Inventory.nonstop,
                     f.Price,
                     f.Inventory.Available
                 }).ToList();

     return query.AsEnumerable();
 }

当我在我的控制器中调用它时:

var result= x.Details(selectedID);

尽管查询返回一个值,但结果变量显示null值。

如何访问控制器中的查询结果?

请提供任何链接、参考、提示。

4

3 回答 3

1

使用返回值序列的 Enumerable() 查询时,在枚举查询对象之前不要使用目标数据。这称为延迟执行。

所以尝试获取这样的值

var result=  x.Details(selectedID).ToList();
于 2013-10-10T06:35:42.683 回答
1

首先:当您调用ToList()AsEnumerable()扩展方法时,您的查询将立即执行,在返回数据量很大的情况下会影响性能。而且您不会在foreach循环 中获得收益回报的优势。

第二:你为什么使用dynamic类型?您可以为返回的数据定义一个类,而不是使用匿名类型,并从 Your 方法返回此类。而且,我猜,您的方法应该只返回一项或null(如果没有具有指定索引的项),因此您可以使用FirstOrDefault()扩展方法。

总结一下:

public class YourReturnType
{
    public int ScheduleId {get; set;}
    // other properties
}

public YourReturnType Details(int ScheduleID)
{
    var scheduleItem = db.schedules.FirstOrDefault(f => f.ScheduleId== ScheduleID);

    if (scheduleItem == null) return null;

    return new YourReturnType 
    {
        ScheduleId = scheduleItem.ScheduleId,
        // assign other properties
    };
}

编辑:如果您返回某个匿名类型的集合并且您的方法的返回类型是动态的以查询此集合您应该将其转换为适当的类型。如果您想按索引访问项目,那么您应该将其转换为 IList:

var result = ((IList)Details(SomeId))[index];
于 2013-10-10T07:14:13.173 回答
0

Details 方法的返回类型必须是 IEnumerable<dynamic>。

public IEnumerable<dynamic> Details(int ScheduleID)
于 2013-10-10T09:18:45.563 回答