[英]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.