2013-03-21 12 views
12

Obecnie w LINQ następujące kompiluje i działa dobrze:Korzystając z LINQ, możliwe jest wyprowadzanie dynamicznego obiektu z instrukcji Select? Jeśli tak to jak?

var listOfFoo = myData.Select(x => new FooModel{ 
    someProperty = x.prop1, 
    someOtherProperty = x.prop2 
}); 

public class FooModel{ 
    public string someProperty { get; set; }; 
    public string someOtherProperty { get; set; }; 
} 

Jednak w ciągu ostatnich kilku wersjach .NET/C# Rozszerzyliśmy rolę dynamicznych obiektów takich jak ExpandoObject i zastanawiam się, czy istnieje sposób w zasadzie to zrobić:

var listOfFoo = myData.Select(x => new ExpandoObject{ 
    someProperty = x.prop1, 
    someOtherProperty = x.prop2 
}); 

Oczywiście, ja już próbowałem powyższy kod bez sukcesu, ale wydaje się, że czegoś mi brakuje.

Odpowiedz

25

powinien być w stanie utworzyć nowy obiekt anonimowy bez jakiegokolwiek rodzaju oświadczył:

var listOfFoo = myData.Select(x => new { 
    someProperty = x.prop1, 
    someOtherProperty = x.prop2 
}); 
+0

D'oh! Człowieku, czuję się głupio. Tak, to było takie łatwe. Potrafi przyjąć odpowiedź w 6 minut. Dzięki! –

+4

@MatthewPatrickCashatt Zauważ, że obiekt nie ma nic dynamicznego. Obiekt tutaj zdefiniowany jest statycznie wpisany, a nawet niezmienny. Teraz, jeśli jest to odpowiednie dla twoich potrzeb, to świetnie, ale jeśli naprawdę chciałeś tego, o co prosiłeś w pytaniu, to nie o to chodzi. – Servy

+0

Dzięki, @Servy. Doceniam również twoją odpowiedź. Jednak w odniesieniu do twojego komentarza jest to mylące, ponieważ podejście @ d_r_w nadal pozwala mi dodawać właściwości dynamiczne do obiektu. Na przykład: foreach (dynamiczna pozycja w listOfFoo {item.someNewProperty = "bar"} 'działa dobrze.Jakie brakuje? –

10

Nic nie uniemożliwia korzystania Select wrócić zbiór ExpandoObject'S, po prostu nie są prawidłowo konstruowania ExpandoObject . Oto jeden sposób:

var listOfFoo = myData.Select(x => 
    { 
     dynamic expando = new ExpandoObject(); 
     expando.someProperty = x.prop1; 
     expando.someOtherProperty = x.prop2; 
     return (ExpandoObject)expando; 
    }); 
+2

Nie sądzę, że będzie działać bez konwersji na IEnumerable –

+0

@MystereMan Konwersja, co do "IEnumerable"? – Servy

+0

Konwersja EF IQueryable (Zakładam, że nie jest Linq do obiektów). Nie sądzę, że kod ExpandoObject będzie podlegał konwersji do SQL, więc prawdopodobnie wygeneruje błąd EF. Aby to zrobić, musisz przekonwertować wyniki na IEnumerable. –

Powiązane problemy