2013-04-10 18 views
14

mam zapytanie jak tenBłąd podczas tworzenia kwerendy LINQ

struct MyStruct 
{ 
    public string name; 
    public double amount; 
} 

var a = 
    from p in Products 
    select new MyStruct 
    { 
    name = p.Name, 
    amount = p.Amount 
    }; 

Kiedy wykonania zapytania pojawia się następujący wyjątek:

System.NotSupportedException { "Tylko konstruktorzy bez parametrów i inicjalizatory są obsługiwane w LINQ do jednostek. "}

, ale jeśli zmienię typ MyStruct na klasa następnie działa zgodnie z oczekiwaniami.

Dlaczego to działa z klasa i kończy się niepowodzeniem z struct?

Odpowiedz

3

Działa z LinqToObjects. Zgaduję, że LinqToEntities nie wie, jak utworzyć strukturę. Jeśli to zrobisz, będziesz w porządku:

struct MyStruct 
{ 
    public string name; 
    public double amount; 
} 

var a = Products.AsEnumerable() 
    .Select(p => new MyStruct 
    { 
     name = p.Name, 
     amount = p.Amount 
    }; 
+1

Ale wtedy nie ograniczasz zapytania do podanych pól, co jest jednym z kluczowych punktów rozpoczęcia selekcji. – Servy

+0

Jeśli obawiasz się, że nie pobierzesz zbędnych danych z bazy danych, możesz utworzyć anonimową klasę pośrednią. Nie rozumiem, dlaczego on używa struktur. – Shlomo

+0

Myślę, że bardziej interesuje go "dlaczego", a następnie "jak to naprawić". – Shlomo

-1

Spróbuj tego:

struct MyStruct 
{ 
      public string name; 
      public double amount; 
} 

Products[] p1 = new Products[] { new Products { name = "prod1", amount = 5 } 
var c = from p in p1 
     select new MyStruct { name = p.name, amount = p.amount }; 
+0

Nie robi Linqa dla obiektów, używa dostawcy zapytań, i jest to dostawca zapytań, który ma problemy z interpretacją tego. – Servy

2

LINQ do podmioty nie obsługuje wystających na elemencie. Będą musieli zaprojektować wsparcie dla tego dostawcy zapytań, a oni po prostu nie chcą tego robić. Wygląda na to, że nie postrzegali go jako wystarczająco wartościowej funkcji, aby móc ją opłacić.

Będziesz musiał wyświetlać nowe instancje klasy klasy w swoich zapytaniach.

+0

> Linq do encji nie obsługuje wyświetlania w strukturach vcRobe