我正在做一个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。其中包含(位置)。
是否有更好/更好的方法来做到这一点?我正在测试小的数据样本,因此一切似乎都还可以,但是我担心,如果数据集足够大,将会出现性能问题或隐藏的错误。
答案 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()));
这将选择具有等于或大于所需标签的任何文件夹,这是我真正想要的,但在问题中没有明确说明。