1

私はこれを持っています:

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変数を「if」の上に移動する必要がありますが、多くの問題が発生しています。

もちろん、最初にnullに設定することは違法です。

私はこれも機能しないようなものを試しました:

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

本当にこれにいくつかの助けを使うことができます。

ありがとう!

4

3 に答える 3

1

これが質問を少し再構成していることを私は知っています、あなたは匿名タイプが必要ですか?同じ情報を保持するクラスを作成してから、varの代わりにある種のIEnumerableコンテナを作成できますか?

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
{

}

そのスコープの外に住むタイプが必要な場合は、それを作成する価値があるかもしれないという考えです。

于 2011-06-06T15:57:27.907 に答える
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
{

}

「selectnew{field= value}」は、作成される匿名型ではなく、ローカルで宣言された明示的な型であるため、変更する必要があります。

Tuple<int,string,string,DateTime>

これらは不変の値型であるため、コンストラクターを呼び出して作成する必要があります(new Tuple(values)を選択します)。

于 2011-06-06T15:59:11.503 に答える
1

申し訳ありませんが、ここでの正解はできません。C#3.0仕様では、匿名型は、オブジェクト初期化子から自動的に推測および作成されるタプル型として記述されています。オブジェクト初期化子は、オブジェクトの1つ以上のフィールドまたはプロパティから値を指定します。つまり、一連の割り当てを通じてオブジェクトの一連のプロパティを指定すると、オブジェクトにこれらのプロパティが割り当てられます。

あなたの場合、コンパイラはここで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ブロックからこの変数を抽出する場合は、それを使用するために明示的にオブジェクトを作成する必要があります。FolderEmailsのゲッターとセッターは、初期化後にのみ使用できます。

于 2011-06-06T16:09:07.533 に答える