【问题标题】:C# casting back to var type?C# 转换回 var 类型?
【发布时间】:2009-06-04 08:22:10
【问题描述】:

我正在使用 LinqToSQL 开发一个 ASP.NET 应用程序。当页面加载时,我运行一个查询并将结果保存到一个变量中......var tasks = query expression。然后我将其保存到会话变量 Session["Tasks"] = tasks...

是否可以将此会话对象转换回其原始 var 状态,以便我可以运行 Count()Reverse() 等方法?

谢谢

【问题讨论】:

    标签: c# .net asp.net linq


    【解决方案1】:

    var 只是类型推断的简写......这里真正的问题是:底层类型是什么?

    如果涉及匿名类型(即新的{...},或者List<>there-of),那么就没有优雅的方式(虽然它可以以一种hacky方式完成)。简而言之;在这种情况下不要使用匿名类型...

    请注意,IQueryable<T> 之类的查询表达式不是 data - 它是一个 query - 用于存储您需要的数据(用于缓存)使用.ToList() / .ToArray() 等。

    重要提示:您不应在会话中存储查询表达式;充其量(内存中的会话提供程序)将使数据上下文保持活动状态;在最坏的情况下(数据库等会话提供程序)它不会工作,因为数据上下文不可序列化。从查询中存储 results 很好;但除此之外,根据请求重建查询表达式。

    在这种情况下,您也许可以使用(例如):

    var tasksQuery = from task in ctx.Tasks
                 where task.IsActive
                 orderby task.Created
                 select task; // this is IQueryable<Task>
    
    Session["Tasts"] = tasksQuery.ToArray(); // this is Task[]
    ...
    var tasks = (Task[]) Session["Tasts"]; // this is Task[]
    

    【讨论】:

    • 我认为它可能类似于 .ToList() 然后将其放入会话中。关于保持数据上下文活跃的注释很有趣。谢谢你:)
    【解决方案2】:

    var 不是类型,它只是告诉 C# 你找出类型。

    string s = "Hello world!";
    

    var s = "Hello world!";
    

    是等价的并返回相同的 s。你可能错过了

    using System.Linq
    

    或其他添加您正在寻找的扩展方法的其他方法。

    【讨论】:

    • 我正在寻找的方法在那里,问题是在回调期间转换回原始 var。你可以做 (String)Session["task"]... 但据我所知你不能做 (var)Session["task"]。
    【解决方案3】:

    var 不是一种“动态”类型,它只是意味着编译器根据初始化值的类型推断出实际的类型。类型是静态确定的,不能“cast to var”

    【讨论】:

      猜你喜欢
      • 2014-09-02
      • 2016-03-20
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      相关资源
      最近更新 更多