我的LINQ查询如下,我查询两个表,具有一对多关系的结算和账单,特别是可以有一个或多个账单的结算。
var TheSettlements = from settlement in context_.Settlements
select new
{
asettlementid = settlement.SettlementId,
SqBills = string.Join(",",
(
from b in context_.Bills
.Where(b => b.SettlementId == settlement.SettlementId)
select new { b.BillMunicipalityId }
))
};
现在琐碎的部分(对我来说)是,我希望这些法案连接在一起,所以经过多个小时的反复试验,我得到了我的结果,但是Bills(BillMunicipalityId)显示在括号内,包括fieldname,就像这样。
我将数据导出到txt的方式更精确,就是这样。
foreach (var settlement in TheSettlements)
{
SettlementsText
.Append(settlement.asettlementid).Append(Delimiter)
.Append(settlement.SqBills.ToString()).Append(Delimiter)
.Append(Newline);
}
我在txt中得到的结果。
3,{ BillMunicipalityId = f9e47f81-fc97-4008-b93d-d384230c53aa },
6,,
7,{ BillMunicipalityId = 8b66610a-20c1-4f47-9f37-489d1a8ce31a },{ BillMunicipalityId = 003d59d4-7bcb-4603-b42c-dc389dd8fb06 },{ BillMunicipalityId = 0070bb29-e3a1-4317-b5e2-3d1ef08dd20b },
我应该如何处理这个以获取值?
只是每个BillMunicipalityId的GUID,没有{ BillMunicipalityId = }
部分。
答案 0 :(得分:2)
我认为不是选择新对象,而是选择像这样的值:
var TheSettlements = from settlement in context_.Settlements
select new
{
asettlementid = settlement.SettlementId,
SqBills = string.Join(",",
(
from b in context_.Bills
.Where(b => b.SettlementId == settlement.SettlementId)
select b.BillMunicipalityId
))
};
答案 1 :(得分:2)
你的Linq声明对我来说真的很奇怪。正如问题所示,你将Linq与扩展方法混合在一起。
如果context
是要转到数据库的DbContext,则将结果与string.Join连接将无效,因为此语句无法转换为SQL代码。但是,如果context
包含内存数据,则可能有效。但我建议不要在Linq中使用string.Join
,除非你在代码中添加一个明确的注释,这个Linq永远不会命中数据库。
当此代码到达数据库时,您将收到NotSupportedException
消息:
LINQ to Entities无法识别方法'System.String Join [Int32]'
我在您的查询中注意到的第二件事,通常数据模型已知一对多关系,您不需要自己加入结果。
解决此问题的最简单方法是使用中间查询,该查询从数据库获取结果,运行查询并将数据存入内存后,使用string.Join()
执行转换
这看起来像是:
var TheSettlements =
from settlement in context_.Settlements
select new
{
asettlementid = settlement.SettlementId,
SqBills = (
from b in settlement.Bills
select b.BillMunicipalityId
).ToList(),
};
// Get the results in memory:
var results = TheSettlements.ToArray();
// Format the results:
var printResults = results.Select(s =>
s.asettlementid.ToString() + ", " + string.Join(", ",s.SqBills));