我正在使用实体框架,我有一个字符串字段,用于保存以逗号分隔的ID。任何字符串中永远不会有超过30个ID,但我可能有数百万行要搜索。 恩。 " 435,6789,1231,232"
我知道我可以使用.Contains()
在字符串中搜索下面的特定IDvar events = dbContext.YogaSpaceEvents.Where(i => i.RegisteredStudentIds.Contains("12345") && i.EventDateTime >= DateTime.Now);
但这会在数百万条记录中慢慢运行吗? 如果是这样,我可以使用更好的方法或列类型,例如xml,当我有数百万行时运行速度会快得多吗?
我很难测试,因为我需要填充数百万行!
答案 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);