如何使用LINQ

时间:2017-12-06 14:18:25

标签: c# asp.net-mvc linq

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

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

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)。我想获得所有包含服务的文件。

2 个答案:

答案 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));