如何在c#中查询对象数组

本文关键字:查询 对象 数组 | 更新日期: 2023-09-27 18:06:58

我想查询一个对象数组"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);
            } 

如何在c#中查询对象数组

根据我的理解,您需要匹配特定ID的项的Sort属性。在这种情况下,你所写的有一些问题:

  • "Where"answers"Select"都接受Lambda表达式,而不是属性名和表达式,所以你提供的代码片段不应该编译。
  • "Where"answers"Select"都返回集合(即使只有一个项目实际上匹配"Where"过滤器;事实上,即使集合中的没有项符合"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

您尝试过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代表object…

我将加入那些说要读一些好的linq教程的人的行列。从这里开始