我是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
});