如何比较列表<;long>;使用逗号分隔的id,使用linq到实体

本文关键字:分隔 id 实体 linq 使用 gt 比较 何比较 列表 long lt | 更新日期: 2023-09-27 18:29:23

我在用户配置文件中有兴趣Ids列&CCD_ 2。我想使用实体框架在列表中获取与兴趣ID匹配的用户配置文件。

Ex。

  • Sam 1,5,9,13,4,8
  • 约翰福音2,7,13,9
  • 酮1,4,8,12,15

列表:{4,8}

我希望输出为{Sam,Kettie}

更新:Db结构-

public class UserProfile
{    
    public long UserId { get; set; }
    public string FullName { get; set; }
    public string Interests { get; set; }  //Store comma separated Interest Ids here 
}
public class Interest
{
    public long InterestId { get; set; }
    public string Name { get; set; }
}

我通过实现了这一点

var interestIds = db.Interests.Where(i => i.Name.Contains(query))
        .Select(i=> i.InterestId)
        .ToList();
var profiles = new List<UserProfile>();
foreach (var id in interestIds)
{
    profiles.AddRange(db.UserProfiles
        .Where(p=> p.Interests.Contains(id.ToString()))
        .ToList());
}
return profiles;

但是,当处理大量记录时,执行需要很长时间,所以我希望得到帮助来优化这一点。

如何比较列表<;long>;使用逗号分隔的id,使用linq到实体

如果答案不是你想要的,我很抱歉,因为我不熟悉实体框架,但纯粹从C#的角度来看:

对于您感兴趣的每个id,您每次都要过滤整个数据库(并通过检查每个条目上的集合来进行过滤)——我想您在这里会受到性能损失。

如果可能的话,您可以将每个兴趣id映射到用户名列表中。这只需要做一次,可能会表现得更好——比如:

var dict = new Dictionary<long, List<string>>();
foreach(var user in userProfiles)
{
    foreach(var interest in user.Interests)
    {
        List<string> names;
        if(dict.TryGetValue(interest, out names))
            names.Add(user.Name);
        else
            dict.Add(interest, new[] { user.Name }.ToList());
    }
}
long[] interestIds = new[] { 4, 8 };
HashSet<string> profiles = new HashSet<string>();
foreach (var interestId in interestIds)
    profiles.UnionWith(dict[interestId]);

因此,对每个用户的每个兴趣进行迭代,然后将每个兴趣添加为一个键,并将该用户添加到该键的用户列表中。

然后,您可以迭代interestId列表,并从字典中提取匹配列表中的用户名(请注意HashSet,这将阻止您为匹配多个兴趣的用户获取重复名称)。

这将帮助您在sql server only once中执行查询。。我用profiler检查了它,它更好,因为当foreach loop iterate。。它每次打开和关闭sql连接。。这会导致填充你的欲望结果慢得多。。

        var interestIds = db.Interests.Where(i => i.Name.Contains("interest_name"))
                        .Select(i => i.InterestId)
                        .ToList().ConvertAll(i => i.ToString());
        //var profiles = new List<UserProfile>();
        var allProfiles = (from UserProfile up in db.UserProfiles
                           from i in interestIds
                           where up.Interests.Contains(i)
                           select up).ToList();
        return allProfiles;
        //string sId = null;
        //foreach (var id in interestIds)
        //{
        //    sId = id.ToString();
        //    profiles.AddRange(db.UserProfiles
        //        .Where(p => p.Interests.Contains(sId))
        //        .ToList());
        //}
        //return profiles;