我有一个数据库,其中包含user_id
和tag_id
的表。我想编写一个函数,该函数需要两个user_id
并返回两个用户共同拥有的tag_id
。
这些是数据库中的示例行:
User_id Tag_id
1 100
1 101
2 100
3 100
3 101
3 102
我想从函数中得到的是,当我像
getCommonTagIDs(1, 3)
那样调用函数时,它应该返回(100,101)
。到目前为止,我所做的是将与user_id
相关的行保留在两个不同的列表中,然后使用for循环返回常见的tag_id
。 using (TwitterDataContext database = TwitterDataContext.CreateTwitterDataContextWithNoLock())
{
IEnumerable<Usr_Tag> tags_1 = database.Usr_Tags.Where(u => u.User_id == userID1).ToList();
IEnumerable<Usr_Tag> tags_2 = database.Usr_Tags.Where(u => u.User_id == userID2).ToList();
foreach (var x in tags_1)
{
foreach (var y in tags_2) {
if (x.Tag_id == y.Tag_id) {
var a =database.Hashtags.Where(u => u.Tag_id==x.Tag_id).SingleOrDefault();
Console.WriteLine(a.Tag_val);
}
}
}
}
我要问的是,不是要从数据库中获取所有行并在函数中搜索常见的
tag_id
,而是要通过在数据库上进行计算,直接使用LINQ从数据库中获取常见的tag_id
侧。如果您能帮助我,我将不胜感激。这是我编写的SQL:
SELECT [Tag_id]
FROM [BitirME].[dbo].[User_Tag]
WHERE USER_ID = '1' AND Tag_id IN (
SELECT [Tag_id]
FROM [BitirME].[dbo].[User_Tag]
where USER_ID = '3')
最佳答案
您想要的是这两个集合的“交集”:
var commonTags = database.Usr_Tags.Where(u => u.User_id == userID1).Select(u => u.Tag_id)
.Intersect(database.Usr_Tags.Where(u => u.User_id == userID2).Select(u => u.Tag_id));
瞧,您完成了。
或者,将其清理一下:
public static IQueryable<int> GetUserTags(int userId)
{
return database.Usr_Tags
.Where(u => u.User_id == userId)
.Select(u => u.Tag_id);
}
var commonTags = GetUserTags(userID1).Intersect(GetUserTags(userID2));
关于c# - C#通过LINQ检索常见记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16407362/