2010-07-25 22 views
6

Tôi có truy vấn LINQ nơi tôi đang tạo một số lớp có thuộc tính Gốc trên chúng. Tôi đang tìm một cách để đặt thuộc tính cha mẹ là lớp mà tôi vừa tạo. Lời giải thích của tôi hút; đây là mã của những gì tôi đang cố gắng làm.LINQ chọn lớp mới có tên

var query = from states in xml.Elements() 
        select new State 
        { 
         Children = from cities in states.Elements() 
            select new City() 
            { 
             ParentState = **???**; 
            } 
        }; 

Làm cách nào để đặt thuộc tính ParentState? Nếu tôi có thể làm điều gì đó như

select new State as newState 
{ 
    ... 
} 

điều đó thật tuyệt, nhưng tôi không thể. Tôi biết tôi có thể làm điều này với một vòng lặp foreach, nhưng tôi muốn tìm hiểu làm thế nào, nếu có thể, để làm điều này với LINQ. Trợ giúp: (

EDIT: Tôi đã thử để x = new State {} nhưng điều đó không giúp được gì nhiều. Tôi hy vọng tôi có thể tham khảo x trong hàm tạo như thế này nhưng không hoạt động:

let x = new State 
{ 
    Children = from cities in states.Elements() 
       select new City{ ParentState = x } 
} 
select x; 

Trong F #, có điều gì đó tương tự như thế này, nơi bạn có thể đơn giản nói cho phép rec x = ... và sau đó bạn có thể tham khảo biến bên trong câu lệnh gán, nhưng đây là C# chứ không phải F #.

Trả lời

0

Xin chào, tôi nghĩ rằng đây là những gì bạn cần

var query = from states in xml.Elements() 
         select new State 
         { 
          Children = from cities in states.Elements() 
             select new City() 
             { 
              ParentState = new State{ 
               Property1 = states.XElement("Property1").Value 
} 
             } 
         }; 

trạng thái biến là trạng thái hiện tại. Tôi đoán là "tiểu bang" var là một XElement và chứa dữ liệu để cư thuộc tính parentstate

Hope this helps

+0

Bé muốn các đối tượng Thành phố trẻ tham chiếu đối tượng Trạng thái gốc. Cách tiếp cận của bạn không hoàn thành mục tiêu này, vì Trạng thái bên ngoài và Trạng thái gốc không phải là cùng một đối tượng. –

+0

Vâng, tôi thấy điều đó ngay bây giờ. Thú vị vấn đề thực sự :) – sTodorov

3

Thú vị vấn đề, và có thể chắc chắn là một cách để làm điều đó bằng cách thiết lập các thuộc tính ngay trong câu lệnh truy vấn, nhưng tôi nghĩ một khả năng khác là di chuyển một số logic đó tới một hàm tạo bên trong State. Hãy xem xét ví dụ mã sau đây

class State 
{ 
    public int Id { get; set; } 
    public List<City> Children { get; set; } 

    public State(int id, IEnumerable<City> childrenCities) 
    { 
     this.Id = id; 
     this.Children = childrenCities.ToList(); 
     foreach (City city in this.Children) 
      city.ParentState = this; 
    } 
} 

Lớp nhà nước này có hàm tạo chấp nhận vô số đối tượng Thành phố. Sau đó nó vòng qua các đối tượng và đặt thuộc tính ParentState.

Và sau đó thay vì đặt thuộc tính bằng biểu thức truy vấn, thay vào đó bạn hãy gọi hàm tạo.

// not LINQ-to-XML, just an example 
var states = from i in Enumerable.Range(0, 10) 
       select new State(
        i, 
        from j in Enumerable.Range(0, 5) 
        select new City 
        { 
         Id = j 
        } 
       ); 
Các vấn đề liên quan