using System.Reflection; using System.Security.Cryptography.X509Certificates; using System.Xml.Serialization; using Castle.Components.DictionaryAdapter.Xml; using Microsoft.EntityFrameworkCore; using Microsoft.VisualBasic; namespace zh { public class ProductPackage { public List Categories { get; set; } = new List(); } public class Category { string Name { get; set; } public List Products = new List(); } public class Product { [Requirements(Requirement.RequiredNonEmpty)] public string Sku { get; set; } public string Name { get; set; } [Requirements(Requirement.RequiredNonNegative)] public int Price { get; set; } } public class Program { public static void Main() { ProductPackage productackage = new ProductPackage(); XmlSerializer serializer = new XmlSerializer(typeof(ProductPackage)); using (StreamReader reader = new StreamReader("zh/products.xml")) { productackage.Categories = (List)serializer.Deserialize(reader); } Shop shop = new Shop(); shop.Category.AddRange(productackage.Categories); shop.SaveChanges(); List expensive = new List(); foreach (Category category in productackage.Categories) { expensive.Concat(from x in category.Products where x.Price > 10000 select x); } } } public enum Requirement { RequiredNonEmpty, RequiredNonNegative } public class RequirementsAttribute : Attribute { public Requirement Rule { get; set; } public RequirementsAttribute(Requirement rule) { Rule = rule; } } public class Validator { public static void Validate(Product product) { var t = product.GetType(); var p = t.GetProperty("Sku"); var a = p.GetCustomAttribute(); var v = p.GetValue(product); if (a.Rule == Requirement.RequiredNonEmpty) { if (v == null || (string)v == "") { throw new WrongProductException(); } } else if(a.Rule == Requirement.RequiredNonNegative) { if ((int)v < 0) { throw new WrongProductException(); } } } } public class WrongProductException : Exception { } public class Shop : DbContext { //public DbSet ProductPackage { get; set; } public DbSet Category { get; set; } public DbSet Product { get; set; } public DbSet Expensive { get; set; } public Shop() { Database.EnsureDeleted(); Database.EnsureCreated(); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { string connStr = @"Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=Shopdb;Integrated Security=True;MultipleActiveResultSets=true"; optionsBuilder.UseSqlServer(connStr); base.OnConfiguring(optionsBuilder); } } }