【问题标题】:How to write this Query in LINQ如何在 LINQ 中编写此查询
【发布时间】:2013-05-10 13:16:14
【问题描述】:

我有一个带有 foreach 循环的 LINQ 查询。一切安好。但需要更多时间才能获得价值。所以有人建议我如何在 LINQ 查询本身中做到这一点。

代码

NormValue = "";
c = 0;
var NormValuelist = db.BCont.Where(x => x.BId == BId && x.TNo == Tag).ToList();
foreach (var item in NormValuelist)
{
    if (c == 0)
        NormValue = item.NormValue;
    else
        NormValue += " " + item.NormValue;
    c = 1;
}

谢谢

【问题讨论】:

    标签: entity-framework c#-4.0 linq-to-entities


    【解决方案1】:

    您可以使用string.Join 重写此查询,以避免在循环中创建多个string 对象,如下所示:

    string NormValue = string.Join(" ", db.BCont.Where(x => x.BId == BId && x.TNo == Tag));
    

    到 DB 的往返次数将保持不变,但 List<string> 和部分连接的 string 对象的创建将被优化。

    【讨论】:

      【解决方案2】:

      除了使用String.Join,还可以使用Enumerable.Aggregate

      var NormValueList = 
          db.BCont.Where(x => x.Bid == BId && x.TNo == Tag)
                  .Select(x => x.NormValue)
                  .Aggregate((s, x) => s + " " + x);
      

      【讨论】:

      • 如何在模型中使用它.. 我正在尝试这样使用.. BTags = Db.BibContents.Where(x => x.BibId == q.BibId && x.TagNo == "245").Aggregate((s, x) => s + " " + x.NormValue) .. 但显示错误。 btags 是一个字符串类型的模型属性。
      • @UniqueChar - 我更新了我的答案。不幸的是,我只是在猜测错误。
      【解决方案3】:

      如果您在“NormValuelist”中有大型项目,那么最好使用 StringBuilder 而不是 string(NormValue)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-15
        • 1970-01-01
        • 2013-04-30
        • 1970-01-01
        • 1970-01-01
        • 2013-05-19
        • 1970-01-01
        相关资源
        最近更新 更多