2011-03-27 74 views
0

我正在用linq查询填充对象模型。该模型是这样的:更新后会话对象为空

MyModel{ 
DateTime AppointDate {get; set;} 
int TotalAppoints {get; set;} 
int AppointDuration {get; set;} 
} 

的LINQ到SQL查询看起来像这样:

public static GetAppointsFromDB(params){ 

    var MyQuery = from....where... 
        select new MyModel{ 
        AppointDate = ..., 
        TotalAppoints = ..., 
        AppointDuration =...}; 

    return MyQuery as MyModel;} 

在母版页,我期待在会话中加载该查询的结果像这样:

if (Session["Appoints"] == null) {Session["Appoints"] = GetAppointsFromDB(...);} 

当我运行代码时,会话始终为空。我第二次添加此行,恰好在后面,查询再次运行。当我在代码中的其他位置使用会话时,它也是空的。该查询的工作原理是因为当我在return语句中放置一个断点时,我看到正确填充了该对象。

请让我知道问题来自哪里,我被困在这个看似简单的问题上,我没有看到我做错了什么。

感谢您的建议。

回答

1
public static GetAppointsFromDB(params) 
{ 

    var MyQuery = from....where... 
       select new MyModel{ 
       AppointDate = ..., 
       TotalAppoints = ..., 
       AppointDuration =...}; 

    return MyQuery as MyModel; 
} 

假设这种方法实际上返回MyModel,所以:

public static MyModel GetAppointsFromDB(params) 

现在你看到的是可能是MyQuery结果的东西,不能转换为MyModel,这就是为什么它返回null - 为什么首先,您是否需要As运营商?如果您的查询总是返回类型的单个实例MyModel你应该

return MyQuery; 

如果您的查询包含枚举为MyModel的(这是什么样子),你只希望返回一个你可以使用

return myQuery.FirstOrDefault(); 

改为。

+0

啊哈!有用。使用FirstOrDefault和SingleOrDefault有什么区别? – frenchie 2011-03-27 17:13:24

+0

如果您的查询返回多个项目,SingleOrDefault()会抛出异常 - FirstOrDefault()将只取第一个(如果您的查询没有返回任何项目,默认行为是相同的) – BrokenGlass 2011-03-27 17:15:01

+0

ok,我们将使用FirstOrDefault ,看起来更安全。 – frenchie 2011-03-27 20:22:05

0

最有可能的是,这是MasterPage.Load事件在Page.Load事件之后触发。 尝试使用Master Page的Init事件,该事件将在Load事件之前运行。

0

您的MyQuery变量的类型为IQueryable<MyQuery>,而不是MyModel,因为您在尝试投射。所以这条线return MyQuery as MyModel返回null

尝试将其更改为例如

var MyQuery = from....where... 
       select new MyModel{ 
        AppointDate = ..., 
        TotalAppoints = ..., 
        AppointDuration =...}; 

return MyQuery.ToList(); 

它应该工作。