Jay*_*Jay 6 .net mapping orm projection
这是基于我假设采用类型的对象:
public class Fruit : IBasicFruit, IFruitDetails
{
// IBasicFruit implementation
public string name { get; set; }
public string color { get; set; }
// IFruitDetails implementation
public string scientific_name { get; set; }
public bool often_mistaken_for_vegetable { get; set; }
public float average_grams { get; set; }
public int century_domesticated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
...并从中创建一个类型的对象:
public class BasicFruit : IBasicFruit
{
public string name { get; set; }
public string color { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
...被称为"投影"或"类型投影"(该投影不仅适用于匿名类型).
现在,假设我将一个序列化BasicFruit的服务器发送到我的客户端应用程序,在那里对这两个字符串执行一些高度复杂的服务器场逻辑,然后将其发送回服务器,其中ORM不知道BasicFruit类型,仅的Fruit实体类型.如果我Fruit基于我的BasicFruit对象创建一个新对象(忽略不存在的属性BasicFruit),那么我的ORM可以保留它,这与投影相反,因为我从子集到超集,或者它仍然被认为是投影,或者这只是映射?
投影可以被视为一种映射形式吗?
在关系代数中,投影是一种采用关系和该关系列的子集并返回新关系的运算。新关系与输入关系相同,只是它仅具有指定的列。
projection : Relation -> Column list -> Relation
Run Code Online (Sandbox Code Playgroud)
输出关系中的行数可能少于输入关系中的行数,因为如果指定列的值相同,则多行将投影到同一行。
现在考虑逆运算:
inverse_projection : Relation -> Column list -> Relation
Run Code Online (Sandbox Code Playgroud)
这里我们有一个输入关系,其列名是输出关系中列的子集。现在我们需要Column list输出关系的列,它现在是输入关系中列的超集。这有点奇怪,因为我们必须为输出关系创建行,其中某些列值未指定。纯粹从关系代数的角度来看,这没有多大意义。毕竟,这些未指定列的数据来自哪里?此外,与投影操作不同,输入和输出关系始终具有相同的行数。
在 SQL 中,我们可以通过仅指定表的某些列来插入数据。未指定的列采用默认值。
INSERT INTO fruit (name, color) VALUES
('apple', 'red'),
('apple', 'green'),
('orange', 'orange');
Run Code Online (Sandbox Code Playgroud)
回到关系代数,这更像是关系的叉积......
NAME, COLOR
apple, red
apple, green
orange, orange
Run Code Online (Sandbox Code Playgroud)
与...的关系
SCIENTIFIC_NAME, OFTEN_MISTAKEN_FOR_A_VEGETABLE, AVERAGE_GRAMS, CENTURY_DOMESTICATED
"", false, null, null
Run Code Online (Sandbox Code Playgroud)
而不是进行所谓的倒置投影。同样,它们在概念上很相似,但您实际上是在使用默认值进行叉积。
| 归档时间: |
|
| 查看次数: |
357 次 |
| 最近记录: |