2013-03-05 12 views
10

Mam kwerendę linq, która zapełnia GridView na Page_Load. Zrobiłem pętlę for znaków alfabetu. W wersji .Command z LinkButton, która zapełnia LinkButton, używam bardzo podobnego zapytania, używając tych samych parametrów w zapytaniu i uzyskując poniższy błąd.Typ Anonymous pojawia się zarówno w błędzie

typu '<> f__AnonymousType2' istnieje zarówno w 'ConcernContracts.dll' i 'System.Web.WebPages.Deployment.dll'

void lnkCharacter_Command(object sender, CommandEventArgs e) 
{ 
    try 
    { 
     var lbtn = (LinkButton)lbl_Alphabet.FindControl("lnkCharacter" + e.CommandArgument); 
     var id = lbtn.Text; 

     using (var db = new dbDataContext()) 
     { 
      var query = from n in db.tbl_Providers 
         where ((n.provider_Name.StartsWith(id)) && (n.provider_Deleted == false)) 
         select new 
         { 
          n.ProviderId, 
          n.provider_Name 
         }; 

      grd_Provider.DataSource = null; 
      grd_Provider.DataSource = query; 
      grd_Provider.DataBind(); 
     } 
    } 
    catch (SystemException ex) { } 
} 

The LoadGrid() jest taka sama ale nie używa warunku .StartsWith(). Czy masz jakieś pomysły, jak rozwiązać ten błąd?

Błąd nie powoduje wyjątku, ale nie wypełnia siatki dla żadnego z zapytań. Błąd został odkryty w następującej linii: grd_Provider.DataSource = query;

+0

Czy projekty są w tym samym rozwiązaniu? Czy mają tę samą przestrzeń nazw? –

+1

Przebuduj, wyczyść, buduj. – Bastardo

+0

Tak, są one w tym samym rozwiązaniu. Zapytania są na tej samej stronie. – StudentRik

Odpowiedz

2

zmienić źródło danych siatki

grd_Provider.DataSource = query.ToList(); 
grd_Provider.DataBind(); 

lub tworzyć listy posiadające dwie właściwości Provider Id i Name i wiążą tę listę z wyjściowym w ten sposób.

List<Entities> abc=query.ToList(); 
grd_Provider.DataSource =abc; 
grd_Provider.DataBind(); 
1

Oto propozycja:

Twoje dwa podobne pytania prawdopodobnie nakładają się na ten typ anonimowy zaznaczania w kwerendzie LINQ. Na jednej i tylko jednej z zapytaniami, zmień wybierz nowy wyglądać tak:

select new 
     { 
     Id = n.ProviderId, 
     Name = n.provider_Name 
     }; 

Jeśli to zrobisz, typy anonimowe nie powinny kolidować więcej, ponieważ jeden nie modyfikować użyje domyślne nazwy.

Powodzenia i mam nadzieję, że to pomoże!

+0

Zrobiłem kolejną siatkę na stronie i próbowałem zagnieździć tę siatkę, ale ona też nie działa. Zastanawiałem się, czy to było, że kwerenda była już uruchamiana na 'LoadGrid()', to dlatego nie jest wypełniana. Potrzebuję innego sposobu na osiągnięcie tego filtra. – StudentRik

0

przekształcić go w List lub IEnumberable, po prostu nie można przejść anonimowych obiektów jak źródłem danych do GridView. query.ToList();

można konwertować typ zwracany do

IEnumerable<object> 

może posiadać dowolny typ anonimowy i zostanie łatwo zbindowanych jako źródło danych

+0

Czy możesz to wyjaśnić? [Linq is IEnumerable.] (Http://msdn.microsoft.com/en-us/library/bb397919.aspx) 'Termin" LINQ to Objects "odnosi się do użycia kwerend LINQ z dowolną kolekcją IEnumerable lub IEnumerable bezpośrednio ' – Harrison

-1

Linq nie obsługuje niektórych funkcji, takich jak .toDays(), addDays(), StartsWith(). Musisz więc najpierw uzyskać wynik bez użycia .StartsWith(), a następnie spróbuj zastosować niektóre funkcje do filtrowania wyników Starty z ID pertikula.

0

Miałem ten sam problem i dodałem inną właściwość do anonimowego typu i to rozwiązało.

Powiązane problemy