【问题标题】:How to Check Whether an Array (or List) Contains Another an Array (List) Using LINQ如何使用 LINQ 检查一个数组(或列表)是否包含另一个数组(列表)
【发布时间】:2017-12-06 23:17:23
【问题描述】:

我正在尝试获取具有所选服务(服务是另一个实体)的文件列表(文件是一个实体)。该文件可以有许多服务。

我尝试了以下语句,但它没有给出正确的结果:

var _serviceTypes = viewModel.SelectedServiceTypes;
// _serviceTypes is an array of integers

var resultsTemp = repository.Files.Where(f => f.Services.Select(s => s.ServiceTypeID).Intersect(_serviceTypes).Any());

我错过了什么?

编辑:

整数数组中的_serviceTypes:{int[2]}

文件可以有许多服务,每个服务作为一个服务类型ID(整数)

例如,一个文件中有两个服务:救护车(服务类型 id:3)和住院(服务类型 id:5)。我想获取所有包含这两种服务的文件。

【问题讨论】:

  • 您是否尝试获取 ID 在 _serviceTypes 列表/数组中的所有文件?
  • 你能在运行时显示_serviceTypes 中的内容,以及之后resultsTemp 中的内容吗?
  • 你所拥有的似乎是对的。你怎么知道它不正确?
  • 请更准确。单个文件应该包含列表中的任何服务还是列表中的所有服务?
  • @grek40 该文件应包含列表中的所有服务。

标签: c# asp.net-mvc linq


【解决方案1】:

以下一些操作应该可以回答您的问题:

// requested IDs
var requestedIDs = new List<int>();
// the IDs from one file
var IDsInFile = new List<int>();
if (requestedIDs.Except(IDsInFile).Any())
{
    // at least some requested IDs are not in the file
}
else
{
    // all requested IDs are in the file
}
if (requestedIDs.Intersect(IDsInFile).Any())
{
    // at least some requested IDs are in the file
}
else
{
    // not a single requested ID is in the file
}

由于您希望每个文件都包含所有请求的服务,因此正确的查询应该是

var _serviceTypes = viewModel.SelectedServiceTypes;
// _serviceTypes is an array of integers

var resultsTemp = repository.Files.Where(f => !_serviceTypes.Except(f.Services.Select(s => s.ServiceTypeID)).Any());

【讨论】:

    【解决方案2】:

    您正在检查两个列表中是否存在单个元素,这可能不是您的想法。尝试检查交集是否等于较小的列表(假设它是_serviceTypes,因为这在您的代码中并不明显):

    var resultsTemp = repository.Files
                                .Where(f => f.Services.Select(s => s.ServiceTypeID)
                                .Intersect(_serviceTypes)
                                .OrderBy(x => x)
                                .SequenceEqual(_serviceTypes.OrderBy(x => x));
    

    【讨论】:

      猜你喜欢
      • 2013-10-13
      • 2017-05-30
      • 1970-01-01
      • 2023-03-24
      • 2013-11-02
      • 1970-01-01
      • 2021-06-06
      • 2017-04-18
      相关资源
      最近更新 更多