0

グリッドビューのフッター行にフィールドの合計を表示するには、動的リストから合計を取得したいのですが、InTopSuppliersView() は別のアセンブリ DAL にあり、グリッドビューはプレゼンテーション レイヤー内にあります。

DAL のコード:

public static dynamic InTopSuppliersView()
{

    var _pd = from pd in InTopSuppliers()
                join pm in PdnmasterDALC.InTopSuppliers() on pd.Pdnmasterid equals pm.Pdnmasterid
                select new
                {
                    RefNo = pm.PDNRefNo,
                    Date = pm.Date
                    Quantity = pd.QuantityApprovedUOM,
                    Rate = pd.Rate,
                    Amount = pd.Amount
                };

    return _pd;
}

フォーム上のコード:

var tmp = InTopSuppliersView();
gvPDNDetail.DataSource = tmp;
gvPDNDetail.DataBind();

gvPDNDetail.FooterRow.Cells[3].Text = tmp.SUM(o => o.Quantity).ToString();

クエリで動的に作成されたフィールド Quantity と Amount の合計を取得したい

ここに画像の説明を入力

4

1 に答える 1

1

私があなたを正しく理解したかどうか見てみましょう:


匿名型のリストを返したいのでdynamicfromを返しますよね?InTopSuppliersViewそして、そのリストを呼び出したいのです.Sumが、ダイナミックはラムダ式が何であるかを知らないため、構文では機能しません ( o => o.Quantity):

最初にデリゲートまたは式ツリー型にキャストしないと、ラムダ式を動的にディスパッチされる操作の引数として使用できません

だから私はあなたがこのようなことをしたいと思っています:

gvPDNDetail.FooterRow.Cells[3].Text = ((IEnumerable<dynamic>)tmp).Sum(o => o.Quantity).ToString();

IEnumerable<dynamic>または、次のように戻り値の型を に変更します。

public static IEnumerable<dynamic> InTopSuppliersView()
{
    return from pd in InTopSuppliers()
           join pm in PdnmasterDALC.InTopSuppliers() on pd.Pdnmasterid equals pm.Pdnmasterid
           select new
           {
               RefNo = pm.PDNRefNo,
               Date = pm.Date
               Quantity = pd.QuantityApprovedUOM,
               Rate = pd.Rate,
               Amount = pd.Amount
           };
}

次に、前のように呼び出します。

// Observe the casing on Sum
gvPDNDetail.FooterRow.Cells[3].Text = tmp.Sum(o => o.Quantity).ToString();

編集:

あなたのコメントから、私は何が起こっているのか知っていると思います。あるアセンブリにはInTopSuppliersViewメソッドがあり、別のアセンブリにはそれを使用するフォームがあります。作成された匿名型はデフォルトinternalであるため、別のアセンブリでは使用できないと思います。代わりに使用するとうまくいくと思いますExpandoObject

public static IEnumerable<dynamic> InTopSuppliersView()
{
    var _pd = from pd in InTopSuppliers()
              join pm in PdnmasterDALC.InTopSuppliers() on pd.Pdnmasterid equals pm.Pdnmasterid
              select new { pd, pm };

    return _pd.Select(o =>
    {
        dynamic obj = new ExpandoObject();

        obj.RefNo = o.pm.PDNRefNo;
        obj.Date = o.pm.Date;
        obj.Quantity = o.pd.QuantityApprovedUOM;
        obj.Rate = o.pd.Rate;
        obj.Amount = o.pd.Amount;

        return obj;
    });
}

(上記の代わりに)[assembly: InternalsVisibleTo("YourAssemblyName")]このメソッドがあるプロジェクトで使用し、「YourAssemblyName」をフォーム プロジェクトのアセンブリ名に変更することもできます。

于 2012-10-18T10:34:46.297 に答える