选择不起作用的特定列LINQ

时间:2017-08-09 06:46:47

标签: c# linq

尝试在Select中获取linq的特定列,其返回的所选列列表但在尝试进入.cshtml页面时会产生错误:

  

'对象'不包含'代码'

的定义

在控制器中:

ViewBag.Data= oDB.Table.Where(x => x.Type == 1).Select(x => new { x.Code, x.Desc }).ToList();

在视图中

@foreach (var item in ViewBag.Data)
{
    <li>@item.Code</li>
}

删除列选择时正常工作:

ViewBag.Data= oDB.Table.Where(x => x.Type == 1).ToList();

有什么区别?

2 个答案:

答案 0 :(得分:0)

@foreach (var item in ViewBag.Cohorts)
{
    <li>@item.Code</li>
}

这不会直接起作用。您必须先使用类型转换或使用关键字

将其强制转换为正确的对象
var list = (ActualTypeGoesHere)ViewBag.Cohorts;
@foreach (var item in list)
{
    <li>@item.Code</li>
}

但由于您使用的是“匿名”类型,因此无法执行任何操作。因此,您必须创建DTO,然后将数据映射到控制器中的DTO,并使用模型或ViewBag将该DTO发送到View。然后将ViewBag转换为DTO,如上所示。

似乎我的答案对OP来说并不清楚,所以我正在添加EDIT

 In View:

@foreach (var item in ViewBag.Data)
{
    <li>@item.Code</li>
}

上面的foreach循环中的项类型不是List的动态类型,在运行时它将是 - item.GetType(){Name =“&lt;&gt; f__AnonymousType1 2" Code = "<>f__AnonymousType1 2 [[System。 String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]}} dynamic {System.RuntimeType} < / p>

如果你做item.GetType();你会得到类型所以现在你看到你不能像你期望的那样直接从项目中提取Code的值。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/dynamic

https://www.codeproject.com/Tips/460614/Difference-between-var-and-dynamic-in-Csharp

答案 1 :(得分:0)

新的{x.Code,x.Desc}为您提供了一种未知类型的新数据类型,因此在这种情况下x.Type将会丢失,并且您不知道从哪个类型的对象获取viewbag.So如果你使用新的Class1 {X.type = 1,X.Code,X.Desc},它将获取Code属性。

订单解决方案是为每个循环使用dynamic而不是var in。