【问题标题】:how to print not mapped value如何打印未映射的值
【发布时间】:2012-10-29 15:09:14
【问题描述】:

我正在使用复杂的 SQL 查询,我必须以简单的方式使用 SqlQuery:

型号:

public class C
{
    public int ID { get; set; }
    [NotMapped]
    public float Value { get; set; }
}

控制器:

IEnumerable<C> results = db.C.SqlQuery(@"SELECT ID, ATAN(-45.01) as Value from C);
return View(results.ToList());

查看:

@model IEnumerable<C>
@foreach (var item in Model) {
    @Html.DisplayFor(modelItem => item.Value)
}

item.Value 的结果为 NULL。

所以我的问题是,我如何打印 SQL 查询中的计算值?

感谢您的帮助。

【问题讨论】:

    标签: asp.net-mvc-3 c#-4.0 razor entity-framework-4


    【解决方案1】:

    我会从 Value 为 0 的事实得出结论,即 EF 不会将返回的列映射到模型中未映射的属性。

    您可以尝试的替代方法是定义帮助器类型...

    public class CHelper
    {
        public int ID { get; set; }
        public float Value { get; set; }
    }
    

    然后查询到这种类型,然后将值复制到您的实体:

    IEnumerable<C> results = db.Database.SqlQuery<CHelper>(
        @"SELECT ID, ATAN(-45.01) as Value from C")
        .Select(ch => new C
        {
            ID = ch.ID,
            Value = ch.Value
        });
    

    (通常在 LINQ-to-Entities 查询中,您不能使用 Select 投影到实体中。但我相信上面示例中的 Select 不会影响数据库查询,并且是 LINQ-to-Objects内存,所以应该允许。不过我不确定。)

    请注意,results 集合未附加到上下文并由上下文跟踪,但我猜您无论如何都不需要它来呈现视图的 GET 请求。

    当然,您可以直接基于 CHelper 类作为视图模型创建视图,并省略到 C 实体的转换。

    【讨论】:

    • 不幸的是它没有工作,代码返回 View(results.ToList());我收到:转换为值类型“Single”失败,因为具体化值为空。结果类型的泛型参数或查询必须使用可为空的类型。并返回视图(结果);我有所有的空值
    • 对多个 cmets 感到抱歉。 lambda 表达式ch 在调试模式下为空。数据库没有返回任何值?或者查询没有发送到数据库?我觉得解决方案非常接近。请帮忙。
    • public class CHelper { public int ID { get; set; } public float? Value { get; set; } } Value 在一条记录中是 null。我将值设置为nullable。现在它的工作。谢谢斯劳马。
    猜你喜欢
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多