2
var rooms = tblRoom
        .Where(r => r.hotel_id==1)
        .GroupBy(p => p.tblType)
        .Select(g => new
            {
            TypeName = g.Key.type_name,
            TypeID = g.Key.type_id,
            TypeCount = g.Count()
            });

            rooms.Dump();

在 LinqPad - 这工作正常,并返回: LinqPad 屏幕截图

但是,当我将其传输到 Visual Studio 时:

var rooms = dbr.Rooms
                .Where(r => r.hotel_id == 1)
                .GroupBy(p => p.type_id)
                .Select(g => new 
                {
                    TypeName = g.Key.type_name,
                    TypeID = g.Key.type_id,
                    TypeCount = g.Count()
                });

我在 g.Key.type_name 部分收到消息:

**“long”不包含“type_name”的定义,并且找不到接受“long”类型的第一个参数的扩展方法“type_name”(您是否缺少 using 指令或程序集引用?)**

我正在尝试将结果添加到以下视图模型:

    public class RatesViewModel
    {
        public string TypeName { get; set; }
        public long TypeID { get; set; }
        public int TypeCount { get; set; }
    }

我再次确定,它一定是我缺少的一些简单的东西 - 所以任何有助于将结果放入视图模型的帮助,将不胜感激。

谢谢,马克

4

3 回答 3

3

我正在尝试将结果添加到以下视图模型:

我看不到您在代码中与此视图模型的关系如何。您正在简单地查询您的存储库并返回一个匿名对象。

如果要返回视图模型,请调整查询以投影到此视图模型:

var rooms = dbr
    .Rooms
    .Where(r => r.hotel_id == 1)
    .GroupBy(p => p.type_id)
    .Select(g => new RatesViewModel
    {
        TypeName = g.Key.type_name,
        TypeID = g.Key.type_id,
        TypeCount = g.Count()
    })
    .ToList();
return View(rooms);

现在您的视图显然将被强输入到视图模型中:

@model IEnumerable<RatesViewModel>
于 2012-08-16T13:04:53.137 回答
1

你有两个问题。首先,您的 LINQ 查询正在创建匿名对象的枚举。您只需要修改查询以指定解决该问题的类型。

接下来是您尝试将查询结果分配给单个对象,而不是对象的枚举。要解决这个问题,您只需要添加一个First()(或Single()、、FirstOrDefault()SingleOrDefault()依赖):

.Select(g => new RatesViewModel
{
    TypeName = g.Key.type_name,
    TypeID = g.Key.type_id,
    TypeCount = g.Count()
}.First()
于 2012-08-16T13:05:37.447 回答
1

查看GroupByLinqpad 与 Visual Studio 中的行。您正在按不同的事物进行分组。

在第一个中,您按对象分组,但在第二个中,您按数字分组。Key是被分组的对象,因此当您按数字分组时调用不起作用g.key.type_name

于 2012-08-16T13:08:57.397 回答