我正在尝试获取具有所选服务的文件列表(文件是实体)(服务是另一个实体)。该文件可以有许多服务。
我尝试了以下声明,但它没有给出正确的结果:
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)。我想获得所有包含服务的文件。
答案 0 :(得分: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());
答案 1 :(得分:0)
您正在检查两个列表中是否存在单个元素,这可能与您的想法不同。尝试检查交集是否等于较小的列表(假设它是_serviceTypes
,因为您的代码中没有明显的那样):
var resultsTemp = repository.Files
.Where(f => f.Services.Select(s => s.ServiceTypeID)
.Intersect(_serviceTypes)
.OrderBy(x => x)
.SequenceEqual(_serviceTypes.OrderBy(x => x));