-1
var result = (from p in productInQuery
      join o in orderInfoQuery on p.refNo equals o.refNo
      join x in productQuery on p.productNo equals x.no
      join t in productOutQuery on p.no equals t.productInNo into productIn
      from t in productIn.DefaultIfEmpty()
      //let dateOut = (from m in orderInfoQuery where m.refNo == t.refNo select m.delivered).FirstOrDefault()
      orderby o.processDate descending
      select new
      {     
          modelNo = x.modelNo,
          mfgNo = p.mfgNo,
          serialNo = p.serialNo,
          poNo = p.poNo,
          lbs = p.lbs,
          width = p.width,
          height = p.height,
          depth = p.depth,
          qty = p.qty,
          dateIn = o.processDate,
          dateOut = (DateTime?)(from m in orderInfoQuery where m.refNo == t.refNo select m.processDate).FirstOrDefault()
      }).ToArray();

この結果を iTextSharp テーブル セルに追加したいと思います。

やり方がわからないのですが、

私は試した、

int resultSize = result.Length;

/*
for (int j = 0; j < resultSize; j++)
{
    table.AddCell(result[j]);
}
*/

foreach (string[] test in result) //Error : Unable to cast object of type 
{
    int testSize = test.Length;
    for (int j = 0; j < testSize; j++)
    {
        table.AddCell(test[j]);
    }
}

しかし、私は道に迷った:(

どなたかご存知の方教えてください〜

[編集]

int resultSize = result.Length; //192

ここに画像の説明を入力

テストにはフィールドがあります...

[編集2]

実際には Model から結果が返されます。

PJ.WebUI.Models レポート クラス

public class Reports 
{
  public Array GetTransaction(){
    OrdersRepository ordersRepository = new OrdersRepository();
    var productInQuery = ordersRepository.ProductIn;
    var productOutQuery = ordersRepository.ProductOut;
    var productQuery = ordersRepository.Product;
    var orderInfoQuery = ordersRepository.OrderInfo;
    var result = (from p in productInQuery
      join o in orderInfoQuery on p.refNo equals o.refNo
      join x in productQuery on p.productNo equals x.no
      join t in productOutQuery on p.no equals t.productInNo into productIn
      from t in productIn.DefaultIfEmpty()
      //let dateOut = (from m in orderInfoQuery where m.refNo == t.refNo select m.delivered).FirstOrDefault()
      orderby o.processDate descending
      select new
      {     
          modelNo = x.modelNo,
          mfgNo = p.mfgNo,
          serialNo = p.serialNo,
          poNo = p.poNo,
          lbs = p.lbs,
          width = p.width,
          height = p.height,
          depth = p.depth,
          qty = p.qty,
          dateIn = o.processDate,
          dateOut = (DateTime?)(from m in orderInfoQuery where m.refNo == t.refNo select m.processDate).FirstOrDefault()
      }).ToArray();
    return result;
  }
}

そしてコントローラーでメソッドを呼び出して結果を取得します。

Reports reposrts = new Reports();
var result = reposrts.GetTransaction();

..

foreach (var test in result)
{
     table.AddCell(test.modelNo);
}

それで

Error   1   'object' does not contain a definition for 'modelNo' and no extension method 'modelNo' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

そう、

モデル メソッドをコントローラー メソッドに移動して (すべて同じメソッドにまとめて)、実行します。それはうまくいきます!

ただし、結果は他のコントローラーでも使用できます。そのため、結果を Model クラスに保持して再利用したいと考えています。

結果のクエリが同じメソッドにない場合に機能しない理由を知りたいです。

もう少し助けていただけますか?

どうもありがとうございました!

4

2 に答える 2

3

「結果」は、文字列配列の配列ではなく、選択した匿名型の配列になるため、foreach ループでエラーが発生します。

ループはおそらく次のようになります。

foreach (var test in result)  
{ 
    table.AddCell(test.modelNo);
    table.AddCell(test.mfgNo);
    table.AddCell(test.serialNo);
    // etc
} 

@編集2:

GetTransaction() の結果は「配列」であるため、呼び出し元のメソッドは型が何であるかを認識せず、単にオブジェクトの配列として認識し、匿名型であるため (合理的に) キャストすることはできません。期待されるタイプに戻ります。

この場合の最善の策は、返したいプロパティを持つ新しいクラスを作成することだと思います。

public class Transaction
{
    public string ModelNo { get; set; }
    public string MfgNo { get; set; }
    public string SerialNo { get; set; }
   // etc. - but with the correct types for the properties
}

次に、linq クエリを変更して、匿名型ではなく、この型を選択します。たとえば、次のようになります。

...
orderby o.processDate descending       
select new Transaction
{            
    ModelNo = x.modelNo,       
    MfgNo = p.mfgNo,       
    SerialNo = p.serialNo,
    // etc.
...

GetTransaction() の戻り値の型を Array から Transaction[] に変更します。

于 2012-06-21T03:47:45.920 に答える
0

何をしようとしているのかは明確ではありませんが、結果の各要素を文字列として誤ってキャストしていると思います。

これを試して:

foreach (var test in result)

test は配列ではないため、おそらく内部コードを微調整する必要がありますが、現在のエラーを回避できるはずです。

于 2012-06-21T03:42:51.637 に答える