2012-04-15 10 views
9

Spędziłem ostatnie 2 dni zastanawiając się, dlaczego to nie działa, ale w przypadku moich innych stołów działa doskonale. Przetestowałem nawet mój drugi model, który zawiera wiele pól. Zrób to, nawet jeśli TYLKO 2 pola nie działają. Wiem, że może mi brakować oczywistej roli, proszę o pomoc.Podany element typu nie jest obsługiwany w LINQ do jednostek. Obsługiwane są tylko inicjalizatory, elementy encji i właściwości nawigacji jednostki.

Oto mój model

public class ReceivedItem 
{   
    public int ReceivedItemID { get; set; } 
    public int ItemID { get; set; } 
} 

ViewModel

public class ReceivedItemViewModel 
{ 
    public int ReceivedItemID { get; set; } 
    public int ItemID { get; set; } 
} 

Controller

[GridAction] 
public ActionResult GetReceivedItems() 
    { 
     return View(new GridModel(GetReceivedItemsViewModels())); 
    } 

private IQueryable<ReceivedItemViewModel> GetReceivedItemsViewModels() 
{ 
    return db.ReceivedItems 
     .Select(
      c => new ReceivedItemViewModel 
      { 
       ItemID = c.ItemID 
      }); 
} 

Zobacz

@(Html.Telerik().Grid<ReceivedItem>() 
.Name("grdItems") 
.DataBinding(binding => binding.Ajax() 
    .Select("GetReceivedItems", "Receiving")) 
.DataKeys(keys => keys.Add(o => o.ItemID)) 
.Columns(cols => 
{ 
    cols.Bound(c => c.ItemID); 
}) 
.Pageable() 
.Sortable() 
.Groupable() 
.Filterable() 

)

Błąd Dostałem za pomocą Firebug:

The specified type member 'ReceivedItemID' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported. 
+0

To pomoże dowiedzieć się, gdzie występuje wyjątek. Ten wyjątek zwykle oznacza, że ​​używasz encji, w której oczekiwana jest wartość pierwotna, na przykład 'Where (a => a.Parent == parentObject)'. (Powinno to być 'Where (a => a.ParentId == parentId)'). –

Odpowiedz

11

Z tego co wiem, nie można zainicjować obiektów non-entity w kwerendzie LINQ-SQL. Spróbuj wyliczyć wyniki, a następnie użyj Linq, aby utworzyć modele widoku.

Co masz (zgaduję to jest, gdy wyjątek jest throw):

// Original Code 
return db.ReceivedItems 
    .Select(
     c => new ReceivedItemViewModel 
     { 
      ItemID = c.ItemID 
     }); 

wyliczanie, a następnie przy użyciu LINQ do tworzenia modeli wyświetlania:

// First statement 
var items = db.ReceivedItems.ToArray(); // Enumerates the collection. 
// Second statement 
return items.Select(
    c => new ReceivedItemViewModel 
    { 
     ItemID = c.ItemID 
    }); 

Pierwszy LINQ instrukcja jest tłumaczona na instrukcję SQL, wyniki są zwracane i wyliczane jako tablica, a na koniec, w drugiej instrukcji, ta tablica służy do tworzenia kolekcji modeli widoku. Z twoim oryginalnym stwierdzeniem, tłumaczenie SQL instrukcji Linq musiałoby uwzględniać model widoku (którego nie jest w stanie zrobić).

Mam nadzieję, że to pomoże. (i ma to sens) :)

2

Uważam, że problem tutaj jest w rzeczywistości wywodzący się z Telerik, ponieważ właśnie wpadłem na ten problem za pomocą Telendik Kendo Grid. Rzutowanie na model widoku (wewnątrz selekcji) nie było faktyczną przyczyną wyjątku.

Należy zauważyć, że odwołana kolumna "ReceivedItemID" nie jest odwzorowywana w rzucie. Naprawiłem problem, po prostu przypisując brakującą właściwość.

return db.ReceivedItems 
    .Select(
     c => new ReceivedItemViewModel 
     { 
      ReceivedItemID = c.ReceivedItemID 
      ItemID = c.ItemID 
     }); 

W moim przypadku nie było dodatkowy etap model został uruchomiony przez:

return Json(model.ToDataSourceResult(request)); 

Telerik metoda ToDataSourceRequest rozszerzenie modyfikuje zapytanie SQL, a robiło się mylić.

0

W kodzie kontrolera, można spróbować zmiany do następujących czynności, aby uczynić go interaktywne

[GridAction] 
public ActionResult GetReceivedItems([DataSourceRequest] DataSourceRequest request) 
    { 
     return Json(db.ReceivedItems.AsEnumerable().Select(x => x).ToDataSourceResult(request)); 
    } 
Powiązane problemy