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
是一个实体,其中asExtendedUser
是从该实体继承的自定义类(但不是实体本身)
这里似乎最简单的解决方案是组合,尽管从概念上讲,继承会更有效
这里有智能解决方案吗?:)
谢谢
。。。使用Linq创建新对象,但它不会将用户复制到ExtendeDeduser,因此我需要重新创建这些对象,这对我来说没有意义
这不是Linq的缺点
在强类型OOP中,一般原则是不能简单地将基类对象转换为派生对象。这样的转换总是涉及复制成员,这会引起身份问题(哪个克隆是真实的?)
换句话说,当一个对象被认为是B类时,它不应该以A类开始生命,即使B源于A。因此,请重新审视您的设计和总体解决方案
当您仍然认为需要此功能时,您遇到的情况是将实体转换为DTO,反之亦然。你可以使用像AutoMapper这样的常用工具 问题是,用户对象是由Entity Framework创建的,它还包含该对象的许多功能,因此我无法轻松复制它。那么
extender
呢?它也是由EntityFramework
创建的吗?当ExtendeDeduser是一个实体时(它应该是这样的),这对于类型为的来说是微不足道的。当你不想要它在数据库中时,考虑合成而不是继承。但一定要提供额外的信息。@HenkHolterman-ExtendedUser不是一个实体,只是一个自定义类。我现在确实使用了组合,因为我找不到一个足够直接的解决方案。是的,实体和非实体之间的继承是一个非常奇怪的概念,不容易处理。所以,回顾一下你是如何得到这个解决方案的,问问你是否真的需要它。向实体添加2个虚拟字段(可能还有一个鉴别器)可能是一种替代方法。这实际上是有意义的:)就是这样!