[英]Call method from within Linq query
如果我有以下查询:-
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。
根据我的阅读,方法无法转换为Linq / SQL。
但是您没有使用Linq-To-Sql
而是使用Linq-To-DataSet
,它是Linq-To-Objects
的子集。
所以,是的,您可以在不使用Linq的情况下做所有可以做的事情,例如调用方法:
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)
};
你有没有尝试过 ?
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
/
由于这不是SQL的Linq,因此可以毫无问题地调用它。
通过将查询的第一部分强制转换为.AsEnumerable()
您已将tblCosts
表中的所有数据提取到内存中。 现在,它不是Linq to SQL查询,而是内存中的linq查询。
您必须评估查询(通过调用.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)
};
好吧,您可以尝试 :
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)
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.