C# LINQ子查询返回方括号和字段名,如何仅获取值?
我的LINQ查询如下,我查询两个具有一对多关系的表,结算和票据,特别是可以有一个结算和一个或多个票据C# LINQ子查询返回方括号和字段名,如何仅获取值?,c#,linq,C#,Linq,我的LINQ查询如下,我查询两个具有一对多关系的表,结算和票据,特别是可以有一个结算和一个或多个票据 var TheSettlements = from settlement in context_.Settlements select new { asettlementid = settle
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 }
))
};
现在(对我来说)最重要的部分是,我希望将账单连接起来,所以经过许多小时的尝试和错误,我得到了结果,但是账单(Bill市政alityId)被放在括号内,包括字段名,如下所示
更准确地说,我将数据导出为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 },
我应该如何处理此问题以仅获取值?只有每个Bill市政ID的GUID,没有
{Bill市政ID=}
部分。我认为与其选择作为新对象,不如选择如下值:
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
))
};
我认为,与其选择新对象,不如选择如下值:
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
))
};
你的Linq声明对我来说真的很奇怪。正如问题中所示,您将Linq与扩展方法混合使用 如果
context
是要到数据库的DbContext,则使用string.Join将结果关联起来将不起作用,因为此语句无法转换为SQL代码。如果context
但是包含内存中的数据,这可能会起作用。但是,我建议不要在Linq中使用string.Join
,除非您在代码中添加明确的注释,否则此Linq永远不会访问数据库
当此代码进入数据库时,您将收到一条NotSupportedException
,其中包含以下消息:
LINQ to实体无法识别方法“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));
你的Linq声明对我来说真的很奇怪。正如问题中所示,您将Linq与扩展方法混合使用
如果context
是要到数据库的DbContext,则使用string.Join将结果关联起来将不起作用,因为此语句无法转换为SQL代码。如果context
但是包含内存中的数据,这可能会起作用。但是,我建议不要在Linq中使用string.Join
,除非您在代码中添加明确的注释,否则此Linq永远不会访问数据库
当此代码进入数据库时,您将收到一条NotSupportedException
,其中包含以下消息:
LINQ to实体无法识别方法“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));
使用Debugger查看这个问题,我看到第一个查询的结果都返回到括号内,并且带有字段名,但是我选择“打印”它们的方式并没有“打印”主查询结果的括号。让我编辑这个问题,以包括我导出数据的方式。使用Debugger查看这个问题,我看到第一个查询的结果都返回到括号内,并且带有字段名,但是我选择的“打印”方式并没有“打印”主查询结果的括号。让我编辑这个问题,包括我导出数据的方式。我不敢相信它真的那么简单!非常感谢。我不敢相信它真的那么简单!非常感谢。谢谢你的建议!这是一个更干净的方法。谢谢你的建议!这是一个更干净的方法。