这是对早期问题的跟进。
我想填充一个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; }
}
任何人都可以帮助查看我的查询或模型,因此它适用于一个查询,或者告诉我如何将查询分成两个,然后合并结果集?
谢谢,
标记
答案 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 && ....
如果这没有帮助,你可以引用初始化上下文的行吗?