2013-09-17 4 views
1

Использование хранимой процедуры SQL Server в Linq Я сохраняю список вопросов в объекте сеанса, как показано ниже.Как читать значение из объекта сеанса

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 

ответ

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 

} 
1
List<Question> QuestionList= Session["QuestionsList"] as List<Question>; 
List<Question> QuestionList= (List<Question>) Session["QuestionsList"]; 

Вы должны иметь тот же тип объектов, которые можно выполнить, и это должно быть сериализуемо.

Первый даст вам значение null, если оно не может быть конвертировано, а второй вариант сработает.

+0

Я пробовал уже, но получаю исключение «Не удается привести объект типа«System.Collections.Generic.List'1 [sp_GetAllQuestionsResult ] ', чтобы напечатать «System.Collections.Generic.List'1 [Вопросы]»." – rumi

+0

Это означает, что ваши типы не совпадают. Сохраняемый объект должен быть того же типа, когда вы пытаетесь его прочитать. –

+0

Я понимаю, что вы говорите о хранении и извлечении в том же типе объекта, но есть ли какое-либо исправление для этой ситуации – rumi

0

Действительно зависит от того, какого типа ваш QuestionsList представляет, но если предположить, что QuestionList является List<Question> то вы хотите что-то вроде:

var QuestionList= Session["QuestionsList"] as List<Question>; 
0
News newsList=new News(); 

Session["news"]=newsList; 

, когда вы хотите получить объект сеанса;

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

Вы должны бросить сессионный .use как то

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(); 
Смежные вопросы