C# 在实体框架中搜索字符串或xml类型,最快的是什么?

C# 在实体框架中搜索字符串或xml类型,最快的是什么?,c#,xml,entity-framework,C#,Xml,Entity Framework,我使用的是实体框架,我有一个字符串字段,用来保存用逗号分隔的ID。任何字符串中的ID都不会超过30个,但我可能有数百万行要搜索。 例如“43567891232” 我知道我可以使用.Contains()在字符串中搜索如下所示的特定ID 但是,对于数百万条记录来说,这真的会运行得很慢吗? 如果是这样的话,有没有更好的方法或列类型可以使用,比如当我有数百万行时,xml会运行得更快 我很难测试,因为我需要填充数百万行 它可能会运行得比需要的慢。只需创建一个名为Registrations的表,并将Even

我使用的是实体框架,我有一个字符串字段,用来保存用逗号分隔的ID。任何字符串中的ID都不会超过30个,但我可能有数百万行要搜索。 例如“43567891232”

我知道我可以使用.Contains()在字符串中搜索如下所示的特定ID

但是,对于数百万条记录来说,这真的会运行得很慢吗? 如果是这样的话,有没有更好的方法或列类型可以使用,比如当我有数百万行时,xml会运行得更快


我很难测试,因为我需要填充数百万行

它可能会运行得比需要的慢。只需创建一个名为Registrations的表,并将EventId和StudentId作为主键,您就可以快速完成:)

在代码方面,它看起来像:

var student = dbContext.Students.FindById(12345); 
var events = student.Events.Where(i.EventDateTime >= DateTime.Now);

这是我到目前为止所拥有的,我有一个事件,我想保留注册学生的记录,这样我可以说“学生12345注册的是什么事件?”然后返回这些事件

public class YogaSpaceEvent
{
    public YogaSpaceEvent() {}

    [Key]
    public int YogaSpaceEventId { get; set; }

    [Index]
    public int YogaSpaceRefId { get; set; }

    [ForeignKey("YogaSpaceRefId")]
    public virtual YogaSpace YogaSpace { get; set; }

    [Required]
    [Index]
    public DateTime EventDateTime { get; set; }

    [Required]
    public YogaTime Time { get; set; }

    [Required]
    public YogaSpaceDuration Duration { get; set; }

    public virtual ICollection<RegisteredStudents> RegisteredStudents { get; set; }
}
现在我可以说

var events = dbContext.RegisteredStudents.Where(i => i.StudentId == 12345).Select(j => j.YogaSpaceEvent);

停止将多个数据作为CSV存储在一个字段中,并正确地规范化您的数据,您就不必担心两种效率极低的搜索方法的比较。最快的方法是使用哈希表。因此,我将获取所有csv ID并创建一个字典,其中包含ID作为键,行号作为值。因此,如果您有多个包含相同id的行,那么字典将是Dictionary dict。然后构建字典。然后进行搜索,这将缩短搜索时间。我唯一担心的是,当该表增长到数百万或数十亿条记录时会发生什么情况。我想保持桌子相对较小。右方问题-我可以创建一个包含两个主键(EventId、StudentId)的表吗?如果将EventId和StudentId设置为主键,则查找速度会很快。您希望将EventId和StudentId设置为同一个键的一部分,以便一个学生只能注册同一个事件一次。我是否也可以创建一个表,该表具有YogaSpaceEvents的外键?
public class RegisteredStudents  
 {
    public RegisteredStudents () {}

    [Key]
    public int RegisteredStudentsId { get; set; }

    [Index]
    public int YogaSpaceEventRefId { get; set; }

    [ForeignKey("YogaSpaceEventRefId")]
    public virtual YogaSpaceEvent YogaSpaceEvent { get; set; }

    public int StudentId { get; set; }
}
var events = dbContext.RegisteredStudents.Where(i => i.StudentId == 12345).Select(j => j.YogaSpaceEvent);