0

这是对先前问题的跟进。

我想填充一个 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();

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

第一张桌子

...当我点击 Occs 时,它会深入到 Occs 类: 第二张桌子

LinqPad 中的完整视图是: 完整结果

我在 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; }
}

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

谢谢,

标记

4

2 回答 2

2

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

(您对 hydr 回答的评论)

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

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

于 2012-08-19T14:30:30.317 回答
1

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

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

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

于 2012-08-16T20:48:48.930 回答