Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ子查询返回方括号和字段名,如何仅获取值?_C#_Linq - Fatal编程技术网

C# LINQ子查询返回方括号和字段名,如何仅获取值?

C# LINQ子查询返回方括号和字段名,如何仅获取值?,c#,linq,C#,Linq,我的LINQ查询如下,我查询两个具有一对多关系的表,结算和票据,特别是可以有一个结算和一个或多个票据 var TheSettlements = from settlement in context_.Settlements select new { asettlementid = settle

我的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 }
                                     ))
                                 };
现在(对我来说)最重要的部分是,我希望将账单连接起来,所以经过许多小时的尝试和错误,我得到了结果,但是账单(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查看这个问题,我看到第一个查询的结果都返回到括号内,并且带有字段名,但是我选择的“打印”方式并没有“打印”主查询结果的括号。让我编辑这个问题,包括我导出数据的方式。我不敢相信它真的那么简单!非常感谢。我不敢相信它真的那么简单!非常感谢。谢谢你的建议!这是一个更干净的方法。谢谢你的建议!这是一个更干净的方法。