【问题标题】:How to query an array of objects in C#如何在 C# 中查询对象数组
【发布时间】:2016-09-14 20:53:18
【问题描述】:

我想查询一个对象数组“sortedData”,其中每个对象都有两个值(ItemId,Sort),用于特定的ItemId并设置“Sort”值。如下所示,但这不是正确的 linq 语法。

var sortedData = db.Fetch<object>("SELECT ItemId, Sort FROM CollectionItems WHERE CollectionId = @0", collectionId);
dataWithSort = db.Fetch<OrganizationForExportWithSort>(TpShared.DAL.StoredProcedures.GetOrganizationsForTargetListUI(clientId, organizationIdList));
foreach(OrganizationForExportWithSort export in dataWithSort)
            {
                    export.Sort = sortedData.Select("Sort").Where(sortedData.ItemId == export.Id);
            } 

【问题讨论】:

  • 无论何时使用 Linq,您都会收到一个数据收集作为回报。 Where 语句允许您细化结果集合中的元素,而 Select 允许您对每个元素执行操作。我强烈建议你在尝试之前先在 Linq 中做一些简单的教程。
  • 我也试过 export.Sort = from d in sortedData where d.ItemId == export.Id select d.Sort;但这也不起作用,因为它没有找到 d.ItemId
  • 您提供的代码示例无法编译。

标签: c# linq


【解决方案1】:

据我了解,您需要与该特定 ID 匹配的项目的 Sort 属性。在这种情况下,您写的内容有一些问题:

  • “Where”和“Select”都采用 Lambda 表达式,而不是属性名称和表达式,因此您提供的代码 sn-p 不应编译。
  • “Where”和“Select”都返回集合(即使只有一个项目实际上与“Where”过滤器匹配;事实上,即使集合中的 no 个项目与“Where”子句仍然会返回一个集合,尽管是一个空的)。更多地考虑 LINQ Select 对集合运行转换,将 LINQ“Where”视为对集合应用过滤器。
  • 作为 LINQ 查询的一般规则,如果可能,您实际上应该在“select”之前运行“where”(先过滤,然后对其余项目应用某种转换)。
  • 在这种情况下,我认为您实际上只想要一个项目,因此您实际上可以使用“FirstOrDefault”而不是“Where”。这将为您留下一个 .NET 对象。这类似于 SQL 中的 TOP 1 限制。拥有 .NET 对象后,您可以从对象本身检索属性。

试试这个:

foreach(OrganizationForExportWithSort export in dataWithSort)
        {
                export.Sort = sortedData.FirstOrDefault(data => data.ItemId == export.Id)?.Sort;
        }

“?”是一个新的 C# 功能,当(且仅当)查询成功找到具有该 ID 的项目时,它将尝试对对象调用 .Sort。如果不是,它只会返回 null。

【讨论】:

    【解决方案2】:

    你试过 Linq 排序吗?

    var sortedData = db.Fetch<object>("SELECT ItemId, Sort FROM CollectionItems WHERE CollectionId = @0", collectionId);
    dataWithSort = db.Fetch<OrganizationForExportWithSort>(TpShared.DAL.StoredProcedures.GetOrganizationsForTargetListUI(clientId, organizationIdList));
    
    // create a list ordered by fields
    var sorted = dataWithSort.OrderBy(o => o.SomeField).ThenBy(o => o.OtherField);
    

    lambda 中的 o 代表对象...

    我将把我的声音加入到人们的合唱中,说要阅读一些好的 linq 教程。 Start Here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 2022-10-07
      • 1970-01-01
      相关资源
      最近更新 更多