LINQ子查询返回括号和字段名,如何获得值?

时间:2017-11-08 20:52:23

标签: c# linq

我的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 = }部分。

2 个答案:

答案 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));