LinqPad查询到Visual Studio - 如何使用嵌套查询来填充视图模型

时间:2012-08-16 19:28:54

标签: asp.net asp.net-mvc asp.net-mvc-3 linq entity-framework

这是对早期问题的跟进。

我想填充一个ViewModel,它有3个属性,还有一个Occ类列表(也有3个属性。

public class RatesViewModel
{
    public string TypeName { get; set; }
    public long TypeID { get; set; }
    public int TypeCount { get; set; }
    public virtual IQueryable<Occ> Occs { get; set; }
}

public class Occ
{
    public string occ { get; set; }
    public decimal ratetocharge { get; set; }
    public int numOfOcc { get; set; }
    public virtual RatesViewModel RatesViewModel { get; set; }
}

当我在LinqPad中运行以下Linq查询时:

var rooms = tblRoom
    .GroupBy(p => p.tblType)
    .Select(g => new
        {
        TypeName = g.Key.type_name,
        TypeID = g.Key.type_id,
        TypeCount = g.Count(),
          Occs = rates.Where(rt => rt.type_id == g.Key.type_id && 
          (
            (rt.type_id == g.Key.type_id)
          ))
          .GroupBy(rt => rt.occ)
          .Select(proj => new 
                       {
                          occ = proj.Key,
                          ratetocharge = proj.Sum(s => s.rate),
                           numOfOcc = proj.Count()
                       })
        });

        rooms.Dump();

...和以前一样,它正确地返回我正在寻找的数据模型:

First table

...当我点击Occs时,它会深入到Occs类中: Second table

LinqPad中的完整视图是: Full results

我在Visual Studio中的查询是:

    var rooms = dbr.Rooms
                .GroupBy(p => p.RoomTypes).Select(g => new RatesViewModel
                {
                    TypeName = g.Key.type_name,
                    TypeID = g.Key.type_id,
                    TypeCount = g.Count()
                    ,
                  Occs = db.Rates.Where(rt => rt.type_id == g.Key.type_id && 
                       (
                        (rt.type_id == g.Key.type_id)
                       ))
                      .GroupBy(rt => rt.occ)
                      .Select(proj => new Occ
                       {
                          occ = proj.Key,
                          ratetocharge = proj.Sum(s => s.rate),
                           numOfOcc = proj.Count()
                       })
                })
                .ToList();

但是在运行时,我收到错误:

指定的LINQ表达式包含对与不同上下文关联的查询的引用。

我认为我理解错误 - 但我不确定如何将查询分成2个单独的查询,然后再将这些查询结果连接在一起以获取原始结果集。

我的模型类是:

public class Rates
{
    public int id { get; set; }
    public long type_id { get; set; }
    public DateTime ratedate { get; set; }
    public decimal rate { get; set; }
    public string occ { get; set; }
    public List<RoomType> Type { get; set; }
}

public class Rental
    {
        [Key]
        public long rental_id { get; set; }
        public long room_id { get; set; }
        public DateTime check_in { get; set; }
        public DateTime check_out { get; set; }
        public virtual Room Room { get; set; }
}

public class Room
{
    [Key]
    public long room_id { get; set; }
    public long type_id { get; set; }
    public virtual RoomType RoomTypes { get; set; }
    public virtual ICollection<Rental> Rentals { get; set; }
}

public class RoomType
{
    [Key]
    public long type_id { get; set; }
    public string type_name { get; set; }
    public IQueryable<Rates> Rates { get; set; }
    public virtual ICollection<Room> Room { get; set; }
}

任何人都可以帮助查看我的查询或模型,因此它适用于一个查询,或者告诉我如何将查询分成两个,然后合并结果集?

谢谢,

标记

2 个答案:

答案 0 :(得分:2)

  

apitest.Models.RoomContext'不包含'Rates'的定义......

(您对hydr的回答的评论)

嗯,你去了:不仅有两个不同的上下文实例,还有两个不同的上下文。我怀疑你的linqpad查询直接针对数据库连接,这意味着它使用了一个linq-to-sql DataContext(即时创建)。

您需要在查询中使用一个上下文类(及其一个实例)。并在Linqpad中连接它以确保您测试与Visual Studio相同的查询提供程序。

答案 1 :(得分:1)

dbr和db似乎是同一上下文的两个不同实例。但在一个查询中,您应该只使用一个上下文。所以我建议如下:

Occs = dbr.Rates.Where(rt => rt.type_id == g.Key.type_id && ....

如果这没有帮助,你可以引用初始化上下文的行吗?