0

以下のクエリがある場合:-

var Values = from data in DtSet.Tables["tblCosts"].AsEnumerable()
            group data by new
            {
                InvNo = data.Field<double>("InvoiceNo"),
                AccRef = data.Field<double>("SiteRefNum"),
            }
            into g
            select new
            {
                Code = "1",
                InvType = "I",
                Account = g.Key.AccRef,
                InvNo = g.Key.InvNo,
                ChargeType = ***********
            };

...別のメソッド CalcChargeType (InvNo 列の値に基づいて文字列を返す) を呼び出して、返された値を ChargeType 列に入れる方法を教えてください。 Linq/SQL に。

4

5 に答える 5

3

私が読んだことから、メソッドはLinq/SQLに変換できません。

しかし、あなたは使用していませんLinq-To-SqlLinq-To-DataSet、のサブセットですLinq-To-Objects

そうです、Linq なしでできることはすべて行うことができます。fe はメソッドを呼び出します。

var Values = from data in DtSet.Tables["tblCosts"].AsEnumerable()
        group data by new
        {
            InvNo = data.Field<double>("InvoiceNo"),
            AccRef = data.Field<double>("SiteRefNum"),
        }
        into g 
        select new
        {
            Code = "1",
            InvType = "I",
            Account = g.Key.AccRef,
            InvNo = g.Key.InvNo,
            ChargeType = CalcChargeType(g.Key.InvNo)
        };
于 2013-01-24T13:45:47.383 に答える
2

これは Linq to SQL ではないので、問題なく呼び出すことができます。

クエリの最初の部分をキャストすると、テーブル.AsEnumerable()内のすべてのデータがメモリにフェッチされます。tblCostsこれは Linq to SQL クエリではなく、インメモリ linq クエリです。

于 2013-01-24T13:45:55.147 に答える
2

やってみました ?

var Values = from data in DtSet.Tables["tblCosts"].AsEnumerable()
            group data by new
            {
                InvNo = data.Field<double>("InvoiceNo"),
                AccRef = data.Field<double>("SiteRefNum"),
            }
            into g
            select new
            {
                Code = "1",
                InvType = "I",
                Account = g.Key.AccRef,
                InvNo = g.Key.InvNo,
                ChargeType = CalcChargeType(g.Key.InvNo)
            };

クエリを評価するとき(ToList()たとえば)、CalcChargeType呼び出されます/

于 2013-01-24T13:45:17.443 に答える
1

さてあなたは試すことができます:

var Values = from data in DtSet.Tables["tblCosts"].AsEnumerable()
        group data by new
        {
            InvNo = data.Field<double>("InvoiceNo"),
            AccRef = data.Field<double>("SiteRefNum"),
        }
        into g
        select new
        {
            Code = "1",
            InvType = "I",
            Account = g.Key.AccRef,
            InvNo = g.Key.InvNo,
            ChargeType = CalcChargeType(g.Key.InvNo)
        };

Linq-to-SQLではなくDataSet拡張機能を使用しているので、うまくいくと思います。Linqプロバイダーがそれをサポートしていない場合、次の賭けは、できることをハイドレイトし、後でChargeType列を追加することです。

var Values = (from data in DtSet.Tables["tblCosts"].AsEnumerable()
        group data by new
        {
            InvNo = data.Field<double>("InvoiceNo"),
            AccRef = data.Field<double>("SiteRefNum"),
        }
        into g).ToList() // hydrate the query
        .Select(g=> new
        {
            Code = "1",
            InvType = "I",
            Account = g.Key.AccRef,
            InvNo = g.Key.InvNo,
            ChargeType = CalcChargeType(g.Key.InvNo)
        });
于 2013-01-24T13:47:24.447 に答える
1

次のように、( を呼び出して) クエリを評価.ToList()し、再度選択して関数を呼び出す必要があります。

var Values = (from data in DtSet.Tables["tblCosts"].AsEnumerable()
        group data by new
        {
            InvNo = data.Field<double>("InvoiceNo"),
            AccRef = data.Field<double>("SiteRefNum"),
        }
        into g)
        .ToList()
        .Select(g => new
        {
            Code = "1",
            InvType = "I",
            Account = g.Key.AccRef,
            InvNo = g.Key.InvNo,
            ChargeType = CalcChargeType(g.Key.ChargeType)
        };
于 2013-01-24T13:45:37.413 に答える