匿名类型列表

4

这是我的代码

var personalInfoQuery = from t in crnnsupContext.Tombstones.Include("ProvState")
                        join n in crnnsupContext.NursingSchools 
                                     on t.NursingSchool equals n.SchoolID
                        where t.RegNumber == _username
                        select new { t, n };

然后我尝试将个人信息查询放入列表中,如下:
List<> personalInfoResult = personalInfoQuery.ToList();

但是如何在列表中表示匿名类型?

我需要将其插入缓存中, 所以Cache.Insert("personalInfo", personalInfoQuery.ToList()) 然后Cache["personalInfo"]变成了一个对象,我该如何从中读取数据?

2个回答

3
那正是“var”关键字的用途所在。
因此,以下代码:
List<> personalInfoResult = personalInfoQuery.ToList();

请使用以下内容:
var personalInfoResult = personalInfoQuery.ToList();

编译器将自动确定准确的类型,您无需指定任何内容。这绝不是不安全的,即使您没有定义类型,它仍然是100%的类型化。

但是我应该把什么放到尖括号里呢?List<> personalInfoResult = personalInfoQuery.ToList(); - pita
1
@pita,你不能把东西放在括号里,这就是为什么要使用var关键字的原因。 - Adrian Iftode
@Adrian Iftode,如果我把这个匿名类型列表保存到缓存中,然后获取它将成为一个对象,如何从中读取数据? - pita
1
@pita 这是无法直接实现的。如果您需要将其存储在缓存中:为此创建一个类!匿名类型只适用于临时解决方案,当您仅需要一定时间内的特定结构时。 - ntziolis

3

由于您的类型需要被多个方法使用(需要由一个方法创建并由另一个方法读取),因此使用匿名类型不合适。只需创建一个简单的类型:

public class TombstoneNursingSchool
{
    public Tombstone Tombstone { get; set; }
    public NursingSchool NursingSchool { get; set; }
}

按照如下方式创建:

var personalInfoQuery = from t in crnnsupContext.Tombstones.Include("ProvState")
                        join n in crnnsupContext.NursingSchools 
                                     on t.NursingSchool equals n.SchoolID
                        where t.RegNumber == _username
                        select new TombstoneNursingSchool {
                            Tombstone = t, 
                            NursingSchool = n 
                        };

制作一个这样的列表:
List<TombstoneNursingSchool> personalInfoResult = personalInfoQuery.ToList();

将其放入缓存中,如下所示:

Cache.Insert("personalInfo", personalInfoQuery.ToList())

从缓存中获取并像这样读取它:
foreach(var tn in (List<TombstoneNursingSchool>)Cache["personalInfo"])
{
     // do something with tn.Tombstone and tn.NursingSchool
}

匿名类型在单个方法内非常方便,但并非适用于所有情况。如果需要,不要害怕创建一个命名类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接