使用 Linq c# 将 List<A> 转换为 List<B>

new*_*bie 5 c# linq list

如何将输入“Person”(由我的数据库创建)的列表转换为输入“myPerson”而不会出现错误。

我试过这个:

DataClasses1DataContext d = new 
DataClasses1DataContext(MainWindow.mySqlClass.GetConnection());

var query = from pers in d.Person select pers;

personen = query.ToList();
newPerson = personen.Cast<myPerson>().ToList();
Run Code Online (Sandbox Code Playgroud)

但我只得到一个System.InvalidCastException.

public partial class myPerson : Person
{
    public override string ToString()
    {
        return Name + " " + Nachname;
    }
    public myPerson(System.Data.Linq.EntitySet<Bilder> bilder, string geschlecht, int iD, string nachname, string name)
    {
        Bilder = bilder;
        Geschlecht = geschlecht;
        ID = iD;
        Nachname = nachname;
        Name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

Linq 创建的类(仅第一行):

public partial class Person : INotifyPropertyChanging, INotifyPropertyChanged
{

    private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);

    private int _ID;

    private string _Nachname;

    private string _Name;

    private string _Geschlecht;

    private EntitySet<Bilder> _Bilder;
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何将列表从类型为 Person 转换为类型为 myPerson 的列表?

或者我如何制作一个“查询”,可以从 Person 转换为 myPerson?

Tim*_*ter 6

每个myPerson实例都可以转换为,Person因为该类myPerson继承自Person. 但你不能做相反的事情,将 toPerson所以myPerson父级转换为子级。仅当它确实是 a 时才可以这样做myPerson,但在本例中不是,因此转换失败。

如果您有一个Person并且想要将其转换为myPerson您应该提供一个构造函数(或工厂方法)来接受Person实例并初始化(或返回)该myPerson实例。

public partial class myPerson : Person
{
    public myPerson(Person p)
    {
        _ID = p.Id;
        _Nachname = p.Nachname;
        _Name = p.Name;
        _Geschlecht = p.Geschlecht;
        _Bilder = p.Bilder;
    }

    private int _ID;
    private string _Nachname;
    private string _Name;
    private string _Geschlecht;
    private EntitySet<Bilder> _Bilder;
    // add properties
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

personen = query.ToList();
newPerson = personen.Select(p => new myPerson(p)).ToList();
Run Code Online (Sandbox Code Playgroud)