public static void UpdateBiblio( LibraryContext context, Biblio biblio) { /* * bool changed = false; * var records = context.Biblios.Where(x => x.RecPath == biblio.RecPath).ToList(); * if (records.Count > 0) * { * context.RemoveRange(records); * changed = true; * } */ context.AddOrUpdate(biblio); context.SaveChanges(); }
public static void CreateTestRecords(LibraryContext context) { // context.Database.Migrate(); string recpath = "test/1"; // 删除可能存在的记录 var record = context.Biblios .Where(x => x.RecPath == recpath).FirstOrDefault(); if (record != null) { context.Biblios.Remove(record); context.SaveChanges(); } // 创建一条新的记录 Biblio biblio = new Biblio { RecPath = recpath }; MarcRecord marc = new MarcRecord(); marc.add(new MarcField('$', "200 $atitle$fauthor")); marc.add(new MarcField('$', "690 $aclass_string1")); marc.add(new MarcField('$', "690 $aclass_string2")); if (MarcUtil.Marc2Xml(marc.Text, "unimarc", out string xml, out string error) == -1) { throw new Exception(error); } biblio.RecPath = recpath; biblio.Xml = xml; biblio.Create(biblio.Xml, biblio.RecPath); context.Biblios.Add(biblio); context.SaveChanges(); }
public static void TestLeftJoin(LibraryContext context) { // *** 第一步,准备数据 string recpath = "test/1"; { // 删除可能存在的记录 var record = context.Biblios .Where(x => x.RecPath == recpath).FirstOrDefault(); if (record != null) { context.Biblios.Remove(record); context.SaveChanges(); } // 创建一条新的记录 Biblio biblio = new Biblio { RecPath = recpath }; MarcRecord marc = new MarcRecord(); marc.add(new MarcField('$', "200 $atitle$fauthor")); marc.add(new MarcField('$', "690 $aclass_string1")); marc.add(new MarcField('$', "690 $aclass_string2")); if (MarcUtil.Marc2Xml(marc.Text, "unimarc", out string xml, out string error) == -1) { throw new Exception(error); } biblio.RecPath = recpath; biblio.Xml = xml; biblio.Create(biblio.Xml, biblio.RecPath); context.Biblios.Add(biblio); context.SaveChanges(); } // *** 第二步,验证 left join { var biblios = context.Biblios.Where(x => x.RecPath == recpath) .LeftJoin( context.Keys, biblio => new { recpath = biblio.RecPath, type = "class_clc", index = 0 }, key => new { recpath = key.BiblioRecPath, type = key.Type, index = key.Index }, (biblio, key) => new { biblio.RecPath, Class = key.Text, } ).ToList(); if (biblios.Count != 1) { throw new Exception("left join 得到的元素个数不正确"); } if (biblios[0].Class != "class_string1") { throw new Exception("得到的分类号字符串不正确"); } /* * StringBuilder text = new StringBuilder(); * foreach (var biblio in biblios) * { * text.AppendLine($"bibliorecpath={biblio.RecPath}, class_clc={biblio.Class}"); * } * * return text.ToString(); */ } }
public static void TestAddOrUpdateBiblio(ref LibraryContext context) { string recpath = "test/1"; // 删除可能存在的记录 var record = context.Biblios .Where(x => x.RecPath == recpath).FirstOrDefault(); if (record != null) { context.Biblios.Remove(record); context.SaveChanges(); } // 创建一条新的记录 { MarcRecord marc = new MarcRecord(); marc.add(new MarcField('$', "200 $atitle1$fauthor1")); marc.add(new MarcField('$', "690 $aclass_string1")); Biblio biblio = new Biblio { RecPath = recpath }; if (MarcUtil.Marc2Xml(marc.Text, "unimarc", out string xml, out string error) == -1) { throw new Exception(error); } biblio.RecPath = recpath; biblio.Xml = xml; biblio.Create(biblio.Xml, biblio.RecPath); context.Add(biblio); context.SaveChanges(); } context.Dispose(); context = new LibraryContext(); // 用于最后阶段比对检索点 List <Key> save_keys = new List <Key>(); // 更新上述书目记录 { MarcRecord marc = new MarcRecord(); marc.add(new MarcField('$', "200 $atitle2$fauthor2")); marc.add(new MarcField('$', "690 $aclass_string2")); if (MarcUtil.Marc2Xml(marc.Text, "unimarc", out string xml, out string error) == -1) { throw new Exception(error); } var biblio = context.Biblios.SingleOrDefault(c => c.RecPath == recpath) ?? new Biblio { RecPath = recpath }; Debug.Assert(biblio.RecPath == recpath); biblio.RecPath = recpath; biblio.Xml = xml; biblio.Create(biblio.Xml, biblio.RecPath); save_keys.AddRange(biblio.Keys); context.AddOrUpdate(biblio); context.SaveChanges(); } context.Dispose(); context = new LibraryContext(); // 检查检索点是否正确 var keys = context.Keys .Where(x => x.BiblioRecPath == recpath) .ToList(); if (keys.Count != save_keys.Count) { throw new Exception($"keys.Count ({keys.Count}) 和 save_keys.Count ({save_keys.Count})应该相等"); } foreach (var current in save_keys) { if (Key.IndexOf(keys, current) == -1) { throw new Exception($"key '{current.ToString()}' 在检索结果中没有找到"); } } }