如何选择具有完全匹配的列值的记录?

时间:2019-12-19 18:48:13

标签: c# linq

我正在做一个WPF宠物项目,假设我有2张桌子:

╔════════════════════╗   ╔══════════════════╗
║ Folders            ║   ║ Tag              ║
╠═══════════╦════════╣   ╠═════════╦════════╣
║ ID        ║ INT    ║   ║ TagID   ║ INT    ║
║ Location  ║ STRING ║   ║ TagName ║ STRING ║
║ Name      ║ STRING ║   ╚═════════╩════════╝
║ TagID     ║ INT    ║
║ Thumbnail ║ STRING ║
╚═══════════╩════════╝

这就是他们里面的东西:

╔═══════════════════════════════════════════════╗   ╔═════════════════╗
║ Folder                                        ║   ║ Tag             ║
╠════╦══════════╦═══════╦═══════╦═══════════════╣   ╠═══════╦═════════╣
║ ID ║ Location ║ Name  ║ TagID ║ Thumbnail     ║   ║ TagID ║ TagName ║
╠════╬══════════╬═══════╬═══════╬═══════════════╣   ╠═══════╬═════════╣
║ 1  ║ D:\      ║ Music ║ 1     ║ D:\folder.jpg ║   ║ 1     ║ Heroic  ║
╠════╬══════════╬═══════╬═══════╬═══════════════╣   ╠═══════╬═════════╣
║ 2  ║ D:\      ║ Music ║ 2     ║ D:\folder.jpg ║   ║ 2     ║ Special ║
╠════╬══════════╬═══════╬═══════╬═══════════════╣   ╠═══════╬═════════╣
║ 3  ║ E:\      ║ Movie ║ 2     ║ E:\001.jpg    ║   ║ 3     ║ Action  ║
╚════╩══════════╩═══════╩═══════╩═══════════════╝   ╚═══════╩═════════╝

现在,我要选择具有两个标签(“英雄”,“特殊”)的文件夹。

我所做的是使用谓词选择任何在临时表中具有“英雄”或“特殊”标签的文件夹。

然后从该表中按位置分组,然后选择位置count()== 2放入列表中。

然后使用该列表从原始表中选择list。其中包含(位置)。

是否有更好/更好的方法来做到这一点?我正在测试小的数据样本,因此一切似乎都还可以,但是我担心,如果数据集足够大,将会出现性能问题或隐藏的错误。

2 个答案:

答案 0 :(得分:0)

欢迎,@ BlurryShadow!

如果我理解您的问题,我认为这可能会有所帮助。

使用LINQ筛选结果。例如:

static bool sortCarrosByPosition(Carro* p1, Carro* p2);

string tags[] = { "Heroic", "Special" } //get ids var tagIds = db.Tag.Where(t => tags.contains(t.TagName)).ToArray(); //related folders var q = db.Folder.Where(f => tagIds.contains(f.TagId)).ToList(); 将仅包含表中的记录,其中q是“英雄”或“特殊”

或者如果您已配置实体关系:

Tag.TagName

答案 1 :(得分:0)

在创建FolderTag表以处理多对多关系之后,我能够将查询简化为:

if (tagList != null)
    foreach (string tag in tagList)
        query = query.Where(f => f.Tags.Any(t => t.TagName.ToLower() == tag.ToLower()));

这将选择具有等于或大于所需标签的任何文件夹,这是我真正想要的,但在问题中没有明确说明。

相关问题