的executeQuery<>使用层次结构对象和LINQ to SQL

时间:2010-09-04 17:16:48

标签: asp.net linq-to-sql dynamic-sql

假设我有两个对象:

public class Person{
     string Name { get; set;}
     Address Home { get; set;}
}

public class Address{
     string Street{ get; set;}
     string City { get; set;}
}


    string sql = "Select Name, Home_street, Home_city from user";
    var results = dc.ExecuteQuery<Person>(sql);

这里的问题是家庭街和家乡城市没有居住。有没有办法让它发挥作用?我认为它可以通过使用Association属性来解决,但不确定如何。

如果我使用存储过程,我会遇到同样的问题。我正在尝试构建一个查询工具,因此很多变量都不会提前知道。

1 个答案:

答案 0 :(得分:1)

您需要创建一个扁平形状的数据对象来捕获结果,然后将这些结果投影到您想要的任何形状。

public class PersonQueryResult
{
  string Name {get;set;}
  string Home_street {get;set;}
  string Home_city {get;set;}
}

string sql = "Select Name, Home_street, Home_city from user";
List<PersonQueryResult> results = dc.ExecuteQuery<PersoneQueryResult(sql).ToList();
List<Person> projectedResults = results.Select(pqr => new Person()
  {
    Name = pqr.Name,
    Home = new Address()
    {
      Street = pqr.Home_street,
      City = pqr.Home_city
    }
  }
).ToList();

如果你有动态生成的类,你会怎么做?这并不是说可以编写针对这些代码的编译器检查代码。

我认为ADO.NET的非编译器检查世界会更恰当地解决这个问题。 To wit

string queryString = 
  "SELECT CustomerID, CompanyName FROM dbo.Customers";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");