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-Sql,但Linq-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

你有没有尝试过 ?

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 回答
2

由于这不是 Linq to SQL,您可以毫无问题地调用它。

通过将查询的第一部分转换为.AsEnumerable()您已将表中的所有数据提取tblCosts到内存中。现在它不是 Linq to SQL 查询,而是内存中的 linq 查询。

于 2013-01-24T13:45:55.147 回答
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 回答
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)
        };

由于您使用的是 DataSet 扩展而不是 Linq-to-SQL,我敢打赌它会起作用。如果您的 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 回答