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

时间:2017-07-13 20:53:13

标签: c# xml entity-framework

我正在使用实体框架,我有一个字符串字段,用于保存以逗号分隔的ID。任何字符串中永远不会有超过30个ID,但我可能有数百万行要搜索。 恩。 " 435,6789,1231,232"

我知道我可以使用.Contains()

在字符串中搜索下面的特定ID
var events = dbContext.YogaSpaceEvents.Where(i => i.RegisteredStudentIds.Contains("12345") && i.EventDateTime >= DateTime.Now);

但这会在数百万条记录中慢慢运行吗? 如果是这样,我可以使用更好的方法或列类型,例如xml,当我有数百万行时运行速度会快得多吗?

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

2 个答案:

答案 0 :(得分:0)

它可能会比需要的速度慢。只需创建一个名为Registrations的表,将EventId和StudentId作为主键,你就可以快速发挥作用:)

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

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

答案 1 :(得分:0)

这是我到目前为止所做的事情,我有一个活动,我想保留已注册学生的记录,所以我可以说"什么活动是学生' 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; }
}

这是RegisteredStudents

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);