Инициализируйте переменную с LINQ и анонимным типом - PullRequest
1 голос
/ 06 июня 2011

У меня есть это:

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 FolderEmails = new { ID = new int(), MessageFrom = string.Empty, MessageSubject = string.Empty, MessageDeliverTime = new DateTime() };

Может действительно помочь с этим?

Спасибо!

Ответы [ 3 ]

1 голос
/ 06 июня 2011

Я не думаю, что анонимные типы предназначены для использования так, как вы хотите (компилятор создает анонимный тип на основе результата присваивания).Почему бы вам просто не объявить тип Tuple и не использовать его.

Edit:

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>

, которые являются типами неизменяемых значений, поэтому вам придется вызывать конструктор для их создания (выбрать новый кортеж (значения)).

1 голос
/ 06 июня 2011

Извините, но правильный ответ здесь вы не можете.Спецификации 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, вам нужно создать объект explicity, чтобы использовать его.После инициализации вы можете использовать только методы получения и установки FolderEmails.

1 голос
/ 06 июня 2011

Я знаю, что это немного перефразирует вопрос, вам нужен анонимный тип? Не могли бы вы создать класс для хранения той же информации, а затем создать некоторый контейнер 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
{

}

Смысл в том, что если вам нужен тип, чтобы жить вне этой области, возможно, стоит создать его.

...