2016-06-27 2 views
1

Mein Problem scheint einfach zu sein, aber ich kann nicht herausfinden, was passiert.LINQ gibt falschen Wert für eine bestimmte Spalte in SQL View-Abfrage

Ich habe die folgende LINQ-Abfrage:

(from p in db.VW_PROJETOS 
    join ic in db.vw_InstanciaCarteira 
    on p.CodigoProjeto equals ic.CodigoProjeto 
    where ic.CodigoCarteira == 125 
    orderby p.CodigoProjeto 
    select p).ToList(); 

Es gibt 9 Einträge aus VW_PROJETOS, wie IDs, FKs, string, Termine ... Wenn ich dieselbe Abfrage in SQL Server Management Studio ausführen, da die folgende

select * from VW_PROJETOS p 
inner join vw_InstanciaCarteira ic on p.CodigoProjeto = ic.CodigoProjeto 
where ic.CodigoCarteira = 125 
order by p.CodigoProjeto 

es wird die gleichen 9 Einträge, mit den gleichen Daten für jeden Eintrag, außer für die Spalte "Desempenho". Hier ist ein kurzes Beispiel:

SQL Server gibt:

CodigoProjeto NomeProjeto Desempenho 
13   Projeto 1 Satisfatório 
1247   Projeto 2 NULL 
1435   Projeto 3 Crítico 

LINQ Abfrage zurückgibt:

CodigoProjeto NomeProjeto Desempenho 
13   Projeto 1 Crítico 
1247   Projeto 2 Crítico 
1435   Projeto 3 Satisfatório 

Ich sah einige Beispiele für ROW_NUMBER Verwendung von Indizes für die Ansichten zu erstellen, um LINQ zu helfen sich nicht selbst zu verlieren, wenn ich mit Ansichten arbeite, aber ich konnte es nicht richtig machen (der Index, der in der SQL-Abfrage angezeigt wurde, unterschied sich immer von dem von LINQ zurückgegebenen Index).

Ist das ein häufiges Problem? Ist es leicht zu korrigieren oder zu umgehen? Es kann ein Fehler in der Ansicht selbst sein?

EDIT:

einige Ihrer Ratschläge Folgen, überprüfte ich die Beziehung zwischen eindeutigen Schlüssel und Feldern in Entitäten Entity Framework. Ich habe mehrere Schlüssel, richtig geordnet, in beide EF-Einheiten eingegeben, aber das Ergebnis war das gleiche. Ich habe die SQL-Abfrage von meinem LINQ generiert und es gibt genau das gleiche Ergebnis wie das, das ich oben gepostet habe. Ich habe die Modelle auch wieder mit Code-First aus der Datenbank generiert, um die Schlüssel nach der Code-Generation zu sortieren, und sie war auch nutzlos.

+1

'VW_PROJETOS' ist eine Datenbankansicht, richtig? Dies ist ein bekanntes EF-Problem mit Sichten, für die kein PK definiert ist. –

+0

@ ivan-stoev Ja, es ist eine Ansicht. Was ist der beste Weg, um eine PK in einer Ansicht zu definieren? Ich habe es noch nie zuvor gemacht. – thiagoprzy

+0

@ ivan-stoev BTW, ist es wirklich eine PK? Ich suche danach und es scheint, dass Ansichten keine PKs, nur Indizes haben können. – thiagoprzy

Antwort

0

Überprüfen Sie den Datentyp für die Spalte "CodigoProjeto" sowohl in db.vw_InstanciaCarteira und db.VW_PROJETOS. Sie sollten übereinstimmen.

+0

Schneiden Sie auch die Werte vor dem Abgleich ab. In einigen Werten könnten Sie etwas mehr Platz haben. –

+0

Es wäre besser, wenn Sie Ihre Frage bearbeiten und stattdessen einen Kommentar abgeben. –

+0

Die Spalte ist INT in SQL- und LINQ-Verweisen für beide Ansichten. – thiagoprzy

1
Use this query. 

(from p in db.VW_PROJETOS 
    join ic in db.vw_InstanciaCarteira 
    on p.CodigoProjeto equals ic.CodigoProjeto 
    where ic.CodigoCarteira == 125 
    orderby p.CodigoProjeto 
    select new { 
    CodigoProjeto=p.CodigoProjeto, 
    NomeProjeto=p. NomeProjeto, 
    Desempenho=ic.Desempenho 
    }.ToList(); 
+0

"Desempenho" ist von VW_PROJETOS, nicht vw_InstanciaCarteira.Außerdem ist Ihre Abfrage nicht anders als meine (ich benutze auch anonymes Objekt, aber entfernte es aus dem obigen Beispiel, weil es zu groß wäre). – thiagoprzy