2017-07-13 5 views
0

私はエンティティフレームワークを使用していますが、私はカンマで区切られたIDを保持するために使用している文字列フィールドを持っています。任意の文字列に〜30個のIDを超えることはありませんが、検索するには何百万行もかかることがあります。 ex。 「435,6789,1231,232は」エンティティフレームワークで文字列またはxml型を検索すると、最も速いのは何ですか?

は私が.Contains()

var events = dbContext.YogaSpaceEvents.Where(i => i.RegisteredStudentIds.Contains("12345") && i.EventDateTime >= DateTime.Now); 

ますが、この実行は本当にゆっくりと数百万レコードとして以下のような特定のIDの文字列を検索することができます知っていますか? もしそうなら、何百万もの行があるときにはるかに高速に動作するxmlのような、より良いアプローチやカラムタイプがありますか?

何百万行ものデータを入力する必要があるため、テストするのは難しいです。

+2

ストップCSVとして1つのフィールド内の複数のデータを格納し、正しくデータを正規化すると言うことができます非常に非効率な2つの検索方法の比較について心配する必要はありません。 –

+0

最も速い方法は、ハッシュテーブルを使用することです。だから私はすべてのcsv idsを取って、キーとしてIDと値として行番号を含む辞書を作成します。したがって、同じIDを含む複数の行がある場合、DictionaryはDictionary > dictになります。次に、辞書を構築します。次に、検索時間を短縮する検索を行います。 – jdweng

答えて

0

おそらく、必要以上に遅く動作します。ここ

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

私がここで心配している唯一のことは、そのテーブルが何百万、おそらく何十億というレコードにまで成長するときです。私はテーブルサイズを比較的小さく保ちたい。右? – user1186050

+0

サイド質問 - 2つの主キー(EventId、StudentId)を持つテーブルを作成できますか? – user1186050

+0

EventIdとStudentIdを主キーにすると、検索が高速になります。 –

0

私が持っているものです:ちょうど主キーとしてのEventIdとStudentIdで登録という名前のテーブルを作成し、速いロケットだろう:)

コード側では、それは意志のようなものに見えます今のところ私はイベントがあり、登録した学生の記録を残しておきたいのですが、 "学生の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); 
関連する問題