Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq Select创建新的继承对象_C#_Entity Framework_Linq_Inheritance - Fatal编程技术网

C# 使用Linq Select创建新的继承对象

C# 使用Linq Select创建新的继承对象,c#,entity-framework,linq,inheritance,C#,Entity Framework,Linq,Inheritance,我有两个类,User和ExtendedUserExtendeDeduser继承自User,只添加了2个int字段-没有什么特别之处 我有一个用户对象的列表-列表,我想浏览这个列表并创建一个扩展程序对象的列表,在这里我只想填充缺少的int字段 我曾考虑使用Linq的Select方法来创建新对象,但它不会将User复制到ExtendedUser——因此我需要重新创建这些对象,这对我来说没有意义 编辑: User是一个实体,其中asExtendedUser是从该实体继承的自定义类(但不是实体本身) 这

我有两个类,
User
ExtendedUser
ExtendeDeduser
继承自
User
,只添加了2个
int
字段-没有什么特别之处

我有一个
用户
对象的列表-
列表
,我想浏览这个列表并创建一个
扩展程序
对象的列表,在这里我只想填充缺少的
int
字段

我曾考虑使用Linq的
Select
方法来创建新对象,但它不会将
User
复制到
ExtendedUser
——因此我需要重新创建这些对象,这对我来说没有意义

编辑:

User
是一个实体,其中as
ExtendedUser
是从该实体继承的自定义类(但不是实体本身)

这里似乎最简单的解决方案是组合,尽管从概念上讲,继承会更有效

这里有智能解决方案吗?:)

谢谢

。。。使用Linq创建新对象,但它不会将用户复制到ExtendeDeduser,因此我需要重新创建这些对象,这对我来说没有意义

这不是Linq的缺点

在强类型OOP中,一般原则是不能简单地将基类对象转换为派生对象。这样的转换总是涉及复制成员,这会引起身份问题(哪个克隆是真实的?)

换句话说,当一个对象被认为是B类时,它不应该以A类开始生命,即使B源于A。因此,请重新审视您的设计和总体解决方案


当您仍然认为需要此功能时,您遇到的情况是将实体转换为DTO,反之亦然。你可以使用像AutoMapper这样的常用工具

问题是,用户对象是由Entity Framework创建的,它还包含该对象的许多功能,因此我无法轻松复制它。那么
extender
呢?它也是由
EntityFramework
创建的吗?当ExtendeDeduser是一个实体时(它应该是这样的),这对于类型为
来说是微不足道的。当你不想要它在数据库中时,考虑合成而不是继承。但一定要提供额外的信息。@HenkHolterman-ExtendedUser不是一个实体,只是一个自定义类。我现在确实使用了组合,因为我找不到一个足够直接的解决方案。是的,实体和非实体之间的继承是一个非常奇怪的概念,不容易处理。所以,回顾一下你是如何得到这个解决方案的,问问你是否真的需要它。向实体添加2个虚拟字段(可能还有一个鉴别器)可能是一种替代方法。这实际上是有意义的:)就是这样!