【发布时间】:2009-06-04 08:22:10
【问题描述】:
我正在使用 LinqToSQL 开发一个 ASP.NET 应用程序。当页面加载时,我运行一个查询并将结果保存到一个变量中......var tasks = query expression。然后我将其保存到会话变量 Session["Tasks"] = tasks...
是否可以将此会话对象转换回其原始 var 状态,以便我可以运行 Count()、Reverse() 等方法?
谢谢
【问题讨论】:
我正在使用 LinqToSQL 开发一个 ASP.NET 应用程序。当页面加载时,我运行一个查询并将结果保存到一个变量中......var tasks = query expression。然后我将其保存到会话变量 Session["Tasks"] = tasks...
是否可以将此会话对象转换回其原始 var 状态,以便我可以运行 Count()、Reverse() 等方法?
谢谢
【问题讨论】:
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[]
【讨论】:
var 不是类型,它只是告诉 C# 你找出类型。
string s = "Hello world!";
和
var s = "Hello world!";
是等价的并返回相同的 s。你可能错过了
using System.Linq
或其他添加您正在寻找的扩展方法的其他方法。
【讨论】:
var 不是一种“动态”类型,它只是意味着编译器根据初始化值的类型推断出实际的类型。类型是静态确定的,不能“cast to var”
【讨论】: