2

在 Linq 中使用 sql server 存储过程,我将问题列表存储在会话对象中,如下所示。

DataClassesDataContext myContext = new DataClassesDataContext();
var QuestionList = myContext.sp_GetAllQuestions().ToList();
Session["QuestionsList"] = QuestionList;

我如何从这个会话对象中读取或转换值,例如

var QuestionList= Session["QuestionsList"]

Sql 存储过程是这样的

SELECT top 24 ROW_NUMBER() OVER (ORDER BY QuestionID) AS QuestionNo,Q.QuestionID,Q.Question,Q.Choices,Q.CorrectAnswer,
 Q.RelatedInfo,Q.QuestionType,CS.Section FROM Questions Q left join dbo.ChapterSection CS on Q.SectionID=CS.SectionID
4

5 回答 5

3

我不喜欢每周类型化会话,因为每次使用都需要类型转换,所以我将所有类型/对象包装在强类型化会话包装器中。

包装基地:

public abstract class SessionBase<T> : SessionBase where T : new()
{
    private static readonly Object _padlock = new Object();

    private static string Key
    {
        get { return typeof(SessionBase<T>).FullName; }
    }

    public static T Current
    {
        get
        {
            var instance = HttpContext.Current.Session[Key] as T;

            if (instance == null)
            {
                lock (SessionBase<T>._padlock)
                {
                    if (instance == null)
                    {
                        HttpContext.Current.Session[Key] = instance = new T();
                    }
                }
            }

            return instance;
        }
    }

    public static void Clear()
    {
        var instance = HttpContext.Current.Session[Key] as T;
        if (instance != null)
        {
            lock (SessionBase<T>._padlock)
            {
                HttpContext.Current.Session[Key] = null;
            }
        }
    }

}

现在创建一个对象(将其标记为可序列化的帮助)

[Serializable]
public QuestionCollection
{
  public QuestionCollection()
  {
    this.Questions = new List<Question>();
  }

  public List<Question> Questions { get; set; }
}

现在将 QuestionCollection 设为强类型 QuestionCollectionSession

public QuestionCollectionSession : SessionBase<QuestionCollection>
{
}

现在你可以像这样使用它:

QuestionCollectionSession.Current.Questions.Add("Are you there?");

当您想从会话中清除/删除它时:

QuestionCollectionSession.Clear();
于 2013-09-17T21:13:14.020 回答
2

这就是var推断类型的用法会让您感到困扰的地方。

明确说明 的类型QuestionList,如下所示:

List<sp_GetAllQuestionsResult> QuestionList = = myContext.sp_GetAllQuestions().ToList();
Session["QuestionsList"] = QuestionList;

现在很明显,当您从Session需要将其转换为的值中获取值时,如下所示:

List<sp_GetAllQuestionsResult> QuestionList= Session["QuestionsList"] as List<sp_GetAllQuestionsResult>;

// Check if the list is null or not
if(QuestionList != null)
{
    // Safe to use list because it was found and successfully cast

}
于 2013-09-17T21:09:30.113 回答
1
List<Question> QuestionList= Session["QuestionsList"] as List<Question>;
List<Question> QuestionList= (List<Question>) Session["QuestionsList"];

您必须拥有相同类型的对象才能进行强制转换,并且它必须是可序列化的。

如果它无法转换,第一个会给你 null 并且第二个选项会崩溃。

于 2013-09-17T20:57:36.667 回答
0

真的取决于你QuestionsList代表什么类型,但如果你假设QuestionList是 aList<Question>那么你会想要这样的东西:

var QuestionList= Session["QuestionsList"] as List<Question>;
于 2013-09-17T20:58:14.047 回答
0
News newsList=new News();

Session["news"]=newsList;

当你想要获取会话对象时;

News newList=Session["news"] as News;

你必须投射会话。像这样使用

于 2013-09-17T21:06:11.520 回答