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

时间:2016-09-14 20:53:18

标签: c# linq

我想查询一个对象数组" sortedData",其中每个对象有两个值(ItemId,Sort),用于特定的ItemId并设置'排序'值。如下所示,但这不是正确的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);
            } 

2 个答案:

答案 0 :(得分:0)

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

  • &#34;其中&#34;和&#34;选择&#34;两者都采用Lambda表达式,而不是属性名称和表达式,因此您提供的代码片段不应该编译。
  • &#34;其中&#34;和&#34;选择&#34;两个返回集合(即使只有一个项目实际上匹配&#34; Where&#34;过滤器;实际上,即使集合中的 no 项目与&#34;其中&#34;条款它仍会返回一个集合,尽管是一个空集合。想想LINQ选择更多关于在集合上运行转换和LINQ&#34;其中&#34;将过滤器应用于一个过滤器。
  • 作为LINQ查询的一般规则,如果可能,您应该实际运行&#34;其中&#34;之前&#34;选择&#34; (首先过滤,然后对剩余项目应用某种变换)。
  • 在这种情况下,我认为你实际上只想要一个项目,所以你实际上可以使用&#34; FirstOrDefault&#34;而不是&#34;在哪里。&#34;这将为您留下一个.NET对象。这类似于SQL中的TOP 1限制。拥有.NET对象后,您可以从对象本身检索属性。

试试这个:

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

&#34;?&#34;是一个新的C#功能,如果(并且仅当)查询成功查找具有该ID的项目时,将尝试调用.Sort。如果它没有,则只返回null。

答案 1 :(得分:0)

您是否尝试过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