Example #1
0
        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();
        }
Example #2
0
        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();
        }
Example #3
0
        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();
                 */
            }
        }
Example #4
0
        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()}' 在检索结果中没有找到");
                }
            }
        }