使用LINQ填充模型

时间:2009-05-28 16:52:24

标签: asp.net linq unit-testing linq-to-sql

我正试图找出一种清晰的方法来将我的模型类从LINQ填充到SQL生成的对象。我的目标是让我的模型和LinqModel分开。说我有以下型号:

public class Person {
    public List<Account> Accounts {get; set;}
}
public class Account {
    public List<Purchase> Purchases {get; set;}
}
public Purchase {
    public String Whatever {get; set;}
}

现在,我也有几乎相同的LINQ to SQL生成的数据模型。因此,如果我想填充Person对象,我将在DataContext分部类中添加一个getter方法:

public Person GetPersonByID(int personID) {
    ....
}

我们如何在应用程序的其余部分中填充此Person对象及其子属性,如下所示:

public Person GetPersonByID(int personID) {
    Person res = 
        from p in Persons 
        select new Person() {
            Accounts = (
                from a in p.Accounts
                select new Account() {
                    Purchases = (
                        from m in p.Purchases
                        select new Purchase() {
                            Whatever = m.Whatever
                        }
                    ).ToList()
                }
            ).ToList()
        }
    return res;
}

因此,对于每个子属性,我们需要扩展查询。我真的更喜欢的是,如果我能做更多这样的事情:

public Person GetPersonByID(int personID) {
    return new Person( this.Persons.SingleOrDefault( p => p.ID == personID ) );
}
....
public class Person {
    public Person(DataModels.Person p) {
        Accounts = (from a in p.Accounts select new Account(a)).ToList();
    }
}
public class Account {
    public Account(DataModels.Account a) {
        Purchases = (from r in a.Purchases select new Purchase(r)).ToList();
    }
}
public class Purchase {
    public Purchase(DataModels.Purchase r) {
        Whatever = r.Whatever
    }
}

这更易于管理,但最初的GetPersonByID调用不会返回填充这些子对象所需的数据。有没有办法解决?

或者使用LINQ to SQL填充模型对象有更好的替代方法吗?

***如果我的代码示例不太正确,我很抱歉*

1 个答案:

答案 0 :(得分:0)

您正在寻找的是“持久性无知”。

它是设计的重要属性,特别是在DDD(域驱动设计)圈子中。

例如,您可以使用LinqToSQL的XML映射功能来实现它,在这种功能中,您不会生成数据类,并向LTS指示如何直接将您的域类(帐户,购买等)映射到数据库。

由于LinqToSQL在映射选项方面的能力有限(特别是缺少值对象,继承映射的限制以及缺少多对多关系支持),它可能会也可能不适用于您的情况。

另一个选择,如果您有LTS生成的类和上面的域类,则应查看Automapper,这可以帮助您完成一些重复性工作。