自定義類型允許定義復(fù)雜的數(shù)據(jù)結(jié)構(gòu),可以根據(jù)需要組織和處理數(shù)據(jù)。
復(fù)合類型
復(fù)合類型類似于表的行。你可以創(chuàng)建一個(gè)復(fù)合類型來包含多個(gè)字段:
CREATE TYPE person AS (
id INTEGER,
name TEXT,
birthdate DATE
);
定義一個(gè)包含 id、name 和 birthdate 字段的自定義類型 person。
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
personal_info person
);
employees 表有一個(gè) personal_info 列,其數(shù)據(jù)類型是自定義的 person 類型。
INSERT INTO employees (personal_info)
VALUES (ROW(1, 'John Doe', '1985-06-15'));
SELECT
(personal_info).id AS employee_id,
(personal_info).name AS employee_name
FROM employees;
CREATE FUNCTION get_person_info(id INTEGER)
RETURNS person AS $$
BEGIN
RETURN QUERY SELECT id, name, birthdate FROM employees WHERE id = id;
END;
$$ LANGUAGE plpgsql;
SELECT * FROM get_person_info(1);
(如果是存的自定義類型,那么EFCore取數(shù)據(jù)的時(shí)候需要映射到具體類型)
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime Birthdate { get; set; }
}
public class Employee
{
public int Id { get; set; }
public Person PersonalInfo { get; set; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Employee>()
.Property(e => e.PersonalInfo)
.HasColumnType("person");
}
** 枚舉類型**
枚舉類型用于定義一組預(yù)定義的值:
CREATE TYPE mood AS ENUM ('happy', 'sad', 'neutral');
這個(gè)枚舉類型 mood 允許的值是 'happy'、'sad' 和 'neutral'。
CREATE TABLE feedback (
id SERIAL PRIMARY KEY,
response mood
);
```sql
INSERT INTO feedback (response) VALUES ('happy');
SELECT * FROM feedback WHERE response = 'happy';
注意存和區(qū)的時(shí)候枚舉是當(dāng)成字符串處理的
public enum Mood
{
Happy,
Sad,
Neutral
}
public class Feedback
{
public int Id { get; set; }
public Mood Response { get; set; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Feedback>()
.Property(f => f.Response)
.HasConversion(
v => v.ToString(), // 將枚舉值轉(zhuǎn)換為數(shù)據(jù)庫中的字符串
v => (Mood)Enum.Parse(typeof(Mood), v)) // 從數(shù)據(jù)庫中的字符串轉(zhuǎn)換為枚舉值
.HasColumnType("mood"); // 設(shè)置列的 PostgreSQL 類型為枚舉類型
base.OnModelCreating(modelBuilder);
}