使用LINQ和匿名类型初始化var

时间:2011-06-06 15:38:32

标签: linq-to-entities initialization anonymous-types var

我有这个:

if (Folder == "Unprocessed")
{
    var FolderEmails = from emails in EmailManagerDAL.Context.Emails
                        join activities in EmailManagerDAL.Context.EmailActivities on emails.ID equals activities.EmailID
                        where activities.EmailID != null
                        select new { emails.ID, emails.MessageFrom,emails.MessageSubject, emails.MessageDeliveryTime };
}
else // Processed
{

}

我需要将FolderEmails var移到“if”之上,但是遇到了很多困难。

当然,最初将其设置为null是非法的。

我尝试过这样的东西也行不通:

var FolderEmails = new { ID = new int(), MessageFrom = string.Empty, MessageSubject = string.Empty, MessageDeliverTime = new DateTime() };

真的可以使用一些帮助。

谢谢!

3 个答案:

答案 0 :(得分:1)

我知道这会重新解释一下这个问题,你需要匿名类型吗?你能创建一个类来保存相同的信息,然后创建一些IEnumerable容器而不是var吗?

List<Foo> FolderEmails;

if (Folder == "Unprocessed")
{
   FolderEmails = from emails in EmailManagerDAL.Context.Emails
                    join activities in EmailManagerDAL.Context.EmailActivities on emails.ID equals activities.EmailID
                    where activities.EmailID != null
                    select new Foo { 
                        ID = emails.ID,
                        MessageFrom = emails.MessageFrom,
                        MessageSubject = emails.MessageSubject, 
                        MessageDeliverTime = emails.MessageDeliveryTime 
                    };
}
else // Processed
{

}

如果您需要类型生活在该范围之外,那么可能值得创建它。

答案 1 :(得分:1)

我认为匿名类型不会像你想要的那样使用(编译器根据赋值结果创建匿名类型)。为什么不直接声明一个元组类型并使用它。

编辑:

IEnumerable<Tuple<int, string, string, DateTime>> FolderEmails = 
    default( IEnumerable<Tuple<int,string,string,DateTime>> );

if (folder == "Unprocessed")
{
    FolderEmails = from emails in EmailManagerDAL.Context.Emails
                    join activities in EmailManagerDAL.Context.EmailActivities on emails.ID equals activities.EmailID
                    where activities.EmailID != null
                    select new Tuple<int, string, string, DateTime>
                    (
                        emails.ID,
                        emails.MessageFrom,
                        emails.MessageSubject,
                        emails.MessageDeliveryTime
                    );
}
else // Processed
{

}

您需要更改“select new {field = value}”,因为它不再是正在创建的匿名类型,它是本地声明的显式类型:

Tuple<int,string,string,DateTime>

是不可变的值类型,因此您必须调用构造函数来创建它们(选择新的元组(值))。

答案 2 :(得分:1)

很抱歉,但正确的答案是你不能。 C#3.0规范将匿名类型描述为自动推断并从对象初始值设定项创建的元组类型。对象初始值设定项指定来自对象的一个​​或多个字段或属性的值。这意味着您通过一系列赋值为对象指定一组属性,并为对象分配这些属性。

在您的情况下,编译器在此处向FolderEmails推断出一种新的对象类型:

var FolderEmails = new { ID = new int(), MessageFrom = string.Empty, MessageSubject = string.Empty, MessageDeliverTime = new DateTime() };

但是这种类型的对象可能与此处不同:

select new { emails.ID, emails.MessageFrom,emails.MessageSubject, emails.MessageDeliveryTime };

因此,这就是为什么它不允许您执行此操作的原因。 在这种情况下,如果您想从if块中提取此var,则需要创建一个explicity对象来使用它。 初始化后,您只能使用FolderEmails的getter和setter。