C# 通过 LINQ 检索常见记录

标签 c# linq

我有一个数据库,其中包含保存user_idtag_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 循环,返回公共(public) 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);  
                    }

                }
            }
        }

我想问的是,我不想从数据库中获取所有行并在函数中搜索公共(public) tag_id ,而是想获取公共(public) tag_id通过在数据库端进行计算,使用 LINQ 直接从数据库获取数据。如果您能帮助我,我将不胜感激。

这是我编写的 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# 通过 LINQ 检索常见记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16407362/

相关文章:

c# - 循环递归自连接表

c# - 表达式树的问题

c# - 并行化/多线程单例对象方法调用

asp.net - 插入图像并更新它(如果存在)

linq - LINQ 查询中子项的 OrderBy

c# - 使用 Linq 查询 XML 文档

c# - 使用 Where 条件给出空值的列表集合过滤

C# 进程无法访问文件 '' ' 因为它正被另一个进程使用

c# - asp.net Oracle 调整线程休眠

c# - 如何从 C# 更改 GridView 中列的格式