21

そのような変数を宣言するにはどうすればよいですか?

            var rData = from nc in ctx.NEWSLETTER_CLIENTS
                        join ni in ctx.NEWSLETTER_INDICES on nc.INDEX_NUM 
                                                          equals ni.INDEX_NUM
                        select new
                        {
                            ClientID = nc.CLIENT_ID,
                            Email = nc.CLIENT_EMAIL_ADDRESS,
                            Index = nc.INDEX_NUM,
                            MainClass = ni.MAIN_CLASS,
                            SubClass = ni.SUB_CLASS,
                            App1 = ni.VALUE_1,
                            App2 = ni.VALUE_2,
                            App3 = ni.VALUE_3,
                            App4 = ni.VALUE_4
                        };

        // Now I need to declare on a variable named fData under the function scope,
        // so I can later use it:

        var fData = ...; //What do I declare here?

        if(x)
            fData = fData.Concat(rData.Where(u => ...));
        if(y)
            fData = fData.Concat(rData.Where(u => ...));
        // etc
4

3 に答える 3

42
IQueryable<type of p> fData = null;

後でクエリを使用する場合 (if の後に iow):

var fData = Enumerable.Empty<type of p>().AsQueryable();

アップデート:

匿名型で使用するために:

IQueryable<T> RestOfMethod<T>(IQueryable<T> rData)
{
  var fData = Enumerable.Empty<T>().AsQueryable(); // or = rData;

  if(x)
    fData = fData.Concat(rData.Where(u => ...));
  if(y)
    fData = fData.Concat(rData.Where(u => ...));

  return fData;
}

// original code location
var rData = some query;
var fData = RestOfMethod(rData);

更新 2:

指摘したように、述語 ofWhereは型を認識しないため、上記は実際には機能しません。パラメータに述語を含めるために、もう少しリファクタリングできます。例:

IQueryable<T> RestOfMethod<T>(IQueryable<T> rData, 
  Expression<Func<T,bool>> pred1,
  Expression<Func<T,bool>> pred2) 
{ ... }

更新 3: (おそらくハッキー)

var fData = rData.Take(0); // should be cheap. 
于 2012-06-07T13:00:29.463 に答える
2

さて、次の解決策は悪いかもしれません (そして、不要なオーバーヘッドが含まれていることさえあります)、うまくいきます:

var fData = from p in rData
            where 0 == 1
            select p;

if(x)
    fData = fData.Concat(rData.Where(u => ...));
if(y)
    fData = fData.Concat(rData.Where(u => ...));
于 2012-06-07T13:51:06.773 に答える
-1

varの代わりにIQueryableとして宣言できます。fData をvarとして宣言できない理由は、「var」が宣言中に型を推測する必要があるためです。型が事前にわかっていれば、問題なく宣言できます。

IQueryable fData = null;

さらに良いことに、pの型がわかっている場合は、IQueryable のジェネリック形式を使用して厳密に型指定することができます。

IQueryable<type-of-p> fdata = null;

これによりnullが割り当てられることに注意してください。使用しようとすると、null 参照例外が発生します。実際に空のQueryable オブジェクトが必要な場合は、leppie の提案を使用し、Enumerable.Empty()を使用して空のコレクションを作成します。AsQueryable()メソッド チェーン。

于 2012-06-07T13:01:26.113 に答える