2012-08-01 15 views
5

Mam listę gdzie MyType: DynamicObject. Powodem dziedziczenia MyType z DynamicObject jest to, że potrzebuję typu, który może zawierać nieznaną liczbę właściwości.Linq z DynamicObject

Wszystko działa poprawnie, dopóki nie trzeba filtrować listy. Czy istnieje sposób mogę zrobić LINQ, który zrobi coś takiego:

return all items where any of the properties is empty string or white space? 
+0

Istnieją inne typy, które mogą zawierać nieznane właściwości, takie jak "ExpandoObject". Twoje życie byłoby o wiele rzędów łatwiejsze, gdybyś użył 'ExpandoObject' zamiast' DynamicObject'. – dasblinkenlight

+0

Musiałbym sprawdzić, czy elementy sterujące interfejsu użytkownika, które używam obsługuje ExpandoObject, ale jeśli tak, nie mam problemu z przejściem z DynamicObject do ExpandoObject. Pytanie brzmi, czy mogę zrobić powyżej zapytania linq z listą ? – Goran

Odpowiedz

1

No tak długo, jak właściwości każdego obiektu nie są znane wewnętrznie sobie można zrobić.

Nie ma wielki rodzajowy sposób przetestować wszystkie właściwości dynamicznych obiektu, jeśli nie mają kontroli nad DynamicObject masz nadzieję, że realizator realizowane GetDynamicMemberNames() i można użyć metody pakietu Nuget ImpromptuInterface za getting the property names i dynamically invoking those names.

return allItems.Where(x=> Impromptu.GetMemberNames(x, dynamicOnly:true) 
         .Any(y=>String.IsNullOrWhiteSpace(Impromptu.InvokeGet(x,y)); 

inaczej, skoro to twój własny rodzaj MyType można dodać własną metodę, która może widzieć rachunkowość wewnętrzną dla tych wartości członkowskich.

return allItems.Where(x => x.MyValues.Any(y=>String.IsNullOrWhitespace(x)); 
3

(z komentarzem) Mogę zrobić powyżej kwerendy LINQ z listy?

Tak, oto jak można to zrobić z ExpandoObject:

var list = new List<ExpandoObject>(); 
dynamic e1 = new ExpandoObject(); 
e1.a = null; 
e1.b = ""; 
dynamic e2 = new ExpandoObject(); 
e2.x = "xxx"; 
e2.y = 123; 
list.Add(e1); 
list.Add(e2); 
var res = list.Where(
    item => item.Any(p => p.Value == null || (p.Value is string && string.IsNullOrEmpty((string)p.Value))) 
); 

ExpandoObject prezentuje interfejs, który pozwala wyliczyć swoje pary właściwość-wartość, jak gdyby były one w słowniku, dzięki czemu proces sprawdzenie ich znacznie prostsze.

+0

Dzięki za wskaźnik do ExpandoObject. Daję temu +1, ale nie mogę zaakceptować tego jako odpowiedzi, ponieważ nie mogę odziedziczyć po ExpandoObject, a ponieważ jbtule odpowiedział bezpośrednio na moje pytanie. – Goran