使用lambda和linq表达式获取返回的整型id列表



我是Lambda和LINQ表达式的新手,但到目前为止我有这个:

// Sample setup/data (all of it)
int[] placeIds = {1, 2, 3, 4, 5};
string[] animals = { "Cow", "Camel", "Elephant", "Goat", "Dog" };
var placeIdsList = new List<int>(placeIds);
var animalsList = new List<string>(animals);

因此,在上述设置中,动物是唯一的,并且属于具有唯一id的地方。我有一个地方id和动物输入列表,我想找到动物所属的地方id。每个地方只能有一个动物(所以这个练习是一对一的关系)。

int[] placeIdsInput = {1, 3, 5};
string[] animalsInput = { "Elephant", "Dog" };
var placeIdsInputList = new List<int>(placeIdsInput);
var animalsInputList = new List<string>(animalsInput);

理论上,这将返回大象和狗的placeid,假设它们是3和5。PlaceId的输入总是有一个count>=输入动物的计数。

我正在尝试这个,但需要帮助的最后一步(我认为):

var placeIdsOfAnimals = _getService.QueryWithNoTracking<Places>()
.Include(i => i.Animals)
.Where(q => q.Contains(placeIdsInputList))
.Select(q => new AnimalDTO
{
Id = q.Id,
Animal = q.Animal
})
.ToList();

现在我如何传入我想要查找的动物以获得它们的位置id返回?

在Where-Function中,您可以修改lambda,以便它只过滤animalsInputList中包含的动物和placeIdInputList中包含的placeid。它看起来像这样:

var placeIdsOfAnimals = _getService.QueryWithNoTracking<Places>()
.Include(i => i.Animals)
.Where(q => q.Contains(placeIdsInputList) 
&& animalsInputList.Contains(q.Animal)
&& placeIdsInputList.Contains(q.Id))
.Select(q => new AnimalDTO
{
Id = q.Id,
Anaiml = q.Animal
})
.ToList();

(最后一部分可能已经由您的q.Contains(placeIdInputList覆盖)-但我不确定您的地方和动物数据结构在内部看起来如何,所以我将其包含在我的查询中)

如果您现在希望它只返回位置id列表,您可以用下面的语句交换当前的Select:

.Select(q => q.Id)

首先,我将创建一个字典来保存动物的值及其占位符id:

var dataSource = animals
.Zip(placeIds, (animal, placeId) => new { Key = animal, Value = placeId})
.ToDictionary(x => x.Key, x => x.Value);

然后,将使用LINQ获取动物id:

var output = animalsInput.Select(x => new 
{
Id = dataSource.TryGetValue(x, out var placeId) ? placeId : -1,
Animal = x
});

最新更新