如何将匿名列列表复制到会话

时间:2019-03-27 12:45:19

标签: c# entity-framework linq

我尝试将列表复制到会话,但是我尝试下面的代码为null。

var questions = dbContext.Sft_Set.Where(s => s.Sft_Set_ID == currentSet)
                  .Select(s => new
                  {
                      id = s.Sft_Set_ID,
                      qid = s.Sft_QuestionID,
                      qName = s.Sft_Question.Q_Question,
                      qtype = s.Sft_Question.Q_Type
                  }).ToList();

Session["questionList"] = questions;
var list = Session["questionList"] as List<Sft_Set>; 

2 个答案:

答案 0 :(得分:1)

不能。

阻止词为anonymous。您无法取消匿名类型的装箱,因为在该框中没有任何已知信息。 (我没有尝试使用dynamic,但没有更优雅的方法)

如vc所说,代码应为:

var questions = dbContext.Sft_Set.Where(s => s.Sft_Set_ID == currentSet)
              .Select(s => new
              Sft_Set {  // <===============================
                  id = s.Sft_Set_ID,
                  qid = s.Sft_QuestionID,
                  qName = s.Sft_Question.Q_Question,
                  qtype = s.Sft_Question.Q_Type
              }).ToList();

Session["questionList"] = questions;
var list = Session["questionList"] as List<Sft_Set>; 

或更可能是

public class SomeDTOType {
    public int id {get; set;}
    public int qid {get; set;}
    public string qname {get; set;}
    public int qtype {get; set;}
}

var questions = dbContext.Sft_Set.Where(s => s.Sft_Set_ID == currentSet)
              .Select(s => new
              SomeDTOType {  // <===============================
                  id = s.Sft_Set_ID,
                  qid = s.Sft_QuestionID,
                  qName = s.Sft_Question.Q_Question,
                  qtype = s.Sft_Question.Q_Type
              }).ToList();

Session["questionList"] = questions;
var list = Session["questionList"] as List<SomeDTOType>; 

答案 1 :(得分:1)

@ vc74在其评论中说list为空,因为您已将匿名对象列表放入会话中,并尝试使用as关键字将此列表转换为{{1} }对象。

由于无法将您的匿名对象列表强制转换为List<Sft_Set>,因此得到的结果为List<Sft_Set>。这并不意味着您的Session [“ questionList”]为null,仅表示无法进行强制转换。

因此,您可以使用以下选项来解决该问题:

  • 不要在Linq查询中使用投影并将列表放入会话中
  • 为您的投影创建一个类,以免使用匿名对象
  • null声明为list,并且不要使用as运算符。这意味着您将没有dynamic
  • 的智能感知和编译时间检查

以下是第二个选项的代码示例:

list