2010-12-06 32 views
0

Ich habe versucht, den hier bereitgestellten Vorschlag für die Verwendung von In-Operator in Linq zu verwenden, aber ich bin nicht in der Lage, meine Anforderung in LINQ-Anweisung zu konvertieren.In Operator in Linq

Unten ist die SQL-Abfrage, die ich Linq konvertieren

select * 
from navigator_user_field_property 
where user_id = 'albert' 
and field_id in (
     select field_id 
     from navigator_entity_field_master 
     where entity_id = 1 
     and use_type = 0) 
order by field_id 

Ich möchte dies eine effiziente Linq umgewandelt werden.

Die meisten Antworten beziehen sich auf die vorgegebene Liste von String-Arrays, die in meinem Fall nicht funktioniert.

Dank

Antwort

2

wie ein Schaut mir kommen:

var query = from navigator in db.NavigatorUserFieldProperties 
      where navigator.UserId == "albert" 
      join field in db.NavigatorEntityFieldMasters 
          .Where(f => f.EntityId == 1 && f.UseType == 0) 
      on navigator.FieldId equals field.FieldId 
      select navigator; 

Beachten Sie, dass diese den gleichen Wert mehrmals zurück, wenn es mehrere Felder mit der gleichen ID sind - aber ich vermute, dass nicht der Fall ist .

Sie könnte tun, um eine wörtliche Übersetzung wie folgt aus:

var query = from navigator in db.NavigatorUserFieldProperties 
      where navigator.UserId == "albert" && 
       db.NavigatorEntityFieldMasters 
        .Where(f => f.EntityId == 1 && f.UseType == 0) 
        .select(f => f.FieldId) 
        .Contains(navigator.FieldId) 
      select navigator; 

... und das kann auf die gleiche SQL übersetzen Ende ... aber ich würde persönlich mit dem gehen beitreten .

1

Hier ist eine effiziente und gut lesbare LINQ-Abfrage:

var fields = 
    from field in db.navigator_entity_field_masters 
    where field.entity_id == 1 && field.user_type == 0 
    select field; 

var properties = 
    from property in db.navigator_user_field_properties 
    where property.user_id == "albert" 
    where fields.Contains(property.field) 
    select property; 

Blick Mama !! Ohne Joins ;-)

+0

Es gibt einen Grund, warum Joins auf SQL-Ebene existieren. Ich könnte mich irren, aber dies könnte möglicherweise zu einer degenerierten Leistung in dem Fall führen, in dem nur ein (kleiner) Bruchteil der gezogenen Datensätze wirklich Übereinstimmungen sind. Wenn dies der Fall ist, dann sollte "effizient" mit den Bedingungen vorangestellt werden. –

+2

@ pst: Ich glaube nicht, dass Sie LINQ (über Ausdruck Bäume) verstehen. Wenn Sie denken, dass alle Felder aus der Datenbank gezogen werden, liegen Sie falsch. LINQ to SQL verwandelt dies in eine sehr performante (und einzelne) Abfrage. Beachten Sie auch, dass LINQ to SQL dies in eine SQL-Abfrage mit Joins umwandelt und dies aufgrund der Metadaten des generierten Modells tun kann. – Steven