2010-12-22 7 views
4

Grundsätzlich möchte ich diese SQL-Abfrage mit Linq machen:Wie übersetzt man SQL "WHERE Ausdruck IN (Abfrage)" in LINQ?

SELECT * 
FROM Orders 
WHERE Identifier IN (SELECT DISTINCT [Order] FROM OrderRows WHERE Quantity = '1') 

Dies ist, was ich mit gekommen sind:

var q = from o in db.Orders 
    where o.Identifier in (from r in db.OrderRows 
          where r.Quantity == 1 select r.Order).Distinct()); 

Aber die in nach o.Identifier nicht gültig .

Wie lautet die korrekte Syntax für das Schlüsselwort IN?

+0

Mögliche Duplikat: http://stackoverflow.com/questions/2066084/in-operator-in-linq – TimothyP

+0

Können Sie einen Join ? IN ist nicht gemacht, um große Daten zu behandeln ... – AFract

Antwort

1

Ich bin ein wenig spät, aber ich habe eine Demo!

Wie andere Leute haben gesagt, habe ich immer verwenden Inhalt:

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ContainsExample 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var foos = new List<Foo> 
      { 
       new Foo { ID = 1, FooName = "Light Side" }, 
       new Foo { ID = 2, FooName = "Dark Side" } 
      }; 

      var bars = new List<Bar> 
      { 
       new Bar { ID = 1, BarName = "Luke", FooID = 1 }, 
       new Bar { ID = 2, BarName = "Han", FooID = 1 }, 
       new Bar { ID = 3, BarName = "Obi-Wan", FooID = 1 }, 
       new Bar { ID = 4, BarName = "Vader", FooID = 2 }, 
       new Bar { ID = 5, BarName = "Palpatine", FooID = 2 }, 
       new Bar { ID = 6, BarName = "Fett", FooID = 2 }, 
       new Bar { ID = 7, BarName = "JarJar", FooID = 3 } 
      }; 

      var criteria = from f in foos 
          select f.ID; 

      var query = from b in bars 
         where criteria.Contains(b.FooID) 
         select b; 

      foreach (Bar b in query) 
      { 
       Console.WriteLine(b.BarName); 
      } 

      Console.WriteLine(); 
      Console.WriteLine("There should be no JarJar..."); 

      Console.ReadLine(); 
     } 
    } 

    public class Foo 
    { 
     public int ID { get; set; } 
     public string FooName { get; set; } 
    } 

    public class Bar 
    { 
     public int ID { get; set; } 
     public string BarName { get; set; } 
     public int FooID { get; set; } 
    } 
} 
+0

Funktioniert wie ein Charme. Vielen Dank! – wazz3r

1
from o in db.Orders 
    where o.Identifier.Any 
     (
     from r in db.OrderRows 
     where r.Quantity == 1 
     select r.Order 
    ).Distinct() 
    select o 

Try this ...

+1

Ich denke, Sie haben die 'Distinct()' an der falschen Stelle. Es will verschiedene Befehle. –

+0

Das Distinct sollte gut funktionieren, da es nur den o.Identifier auswählt. Vielen Dank an edze. – wazz3r

+0

np - Sie sehen, wie ANY zu verwenden, aber die Lösung mit Join scheint besser zu sein – edze

0

haben Sie versucht, so etwas wie dies mit:

int[] inKeyword = { 5, 7, 9 }; 
var q = from o in db.Orders.Where(p => inKeyword.Contains(p.Identifier)); 

Hoffe, es hilft :)

0
var q = from o in db.Orders 
    where (from r in db.OrderRows 
      where r.Quantity == 1 select r.Order).Distinct().Contains(o.Identifier); 
1

Es scheint, wie Sie teilnehmen möchten :

var q = (from o in db.Orders 
     join r in db.OrderRows on o.Identifier equals r.Order 
     where r.Quantity == 1 
     select o).Distinct(); 
0

Die kurze Antwort ist, dass Sie die Contains Methode nutzen möchten.

int[] ids = { 2, 5, 6, 1 }; 

var a = from myRecords in context.db 
where ids.Contains (myRecords.id) 
select new {Id = myRecords.id}; 

Filtern auf zwei Sätze von Ergebnissen funktioniert auf die gleiche Art und Weise, dass Sie auf jede gemeinsame Eigenschaft filtern können durch die beiden Sätze geteilt:

string[] cities = { "London", "Paris", "Seattle" }; 
var query = dataContext.Customers.Where (c => cities.Contains (c.City)); 
Verwandte Themen