2012-03-30 6 views
1

Hallo ich ein Array von Featureset Id haben, hat meine Fahrzeuge Tisch Unter Tabelle als FeatureSets bekam Ich schrieb SQL-Abfrage wieLinqToSql Sub Entiity Multiple und Betreiber

SELECT [t0].[ID] 
FROM [dbo].[SearchResultView] AS [t0] 
Join [dbo].[VehicleFeatureSet] AS [t1] on t0.ID = t1.VehicleID 
where t1.FeatureSetID = 1 and t1.FeatureSetID= 2 and t1.FeatureSetID= 3 

habe ich versucht. Aber ich konnte nicht

var features = Request.QueryString["FeatureSets"].Split(',').ToList().ConvertAll(new Converter<string, int>(StrinToint)); 
IQueryable<SearchResultView> result = db.SearchResultViews.Where(m => m.Active == true); 


      foreach (var featuree in features) 
      { 
       result = result.Where(m => m.VehicleFeatureSets.Any(c => c.FeatureSetID == featuree)); 
      } 

Wie kann ich diese LINQ-Abfrage

+1

Wie von Mattytommo angegeben, enthält Ihre SQL-Abfrage ein Prädikat, das immer falsch ist ('t1.FeatureSetID = 1 und ...'). Das Lustige ist, ich denke, Ihre linq macht genau das, was Sie erreichen wollen, aber natürlich ist das produzierte SQL anders. Ich denke, es enthält 'EXISTS', aber es soll sie enthalten. Dies unter der Annahme, dass Sie 'SearchResultView'-Datensätze mit _both_ 1 _und_ 2 _and_ 3 in ihren' VehicleFeatureSets' haben möchten. –

Antwort

1

ich meine Linq-Abfrage, um SQL-Abfrage umgewandelt. Eigentlich könnte ich nicht LINQ Abfrage schreiben für diese :)

SELECT Vehicle.[ID] 
     ,[Make] 
     ,[Model] 
     ,[Km] 
     ,[RegistrationYear] 
     ,[Price] 
     ,[Currency] 
     ,[AdsStartDate] 
     ,[ThumbPhoto] 
    FROM [SearchResultView] as Vehicle 
left Join VehicleFeatureSet vs on Vehicle.ID=vs.VehicleID where Vehicle.Active = 1 
AND vs.FeatureSetID IN(1,5,7,9) // 1,5,7,9 comes from array 
group by Vehicle.[ID],[Make] 
     ,[Model] 
     ,[Km] 
     ,[RegistrationYear] 
     ,[Price] 
     ,[Currency] 
     ,[AdsStartDate] 
     ,[ThumbPhoto] 
Having Count(vs.FeatureSetID) = 4 // length of my feature array 
// sb = msSql query ,StringBuilder 
// Then I used DataContext.ExecuteQuery() 
db.ExecuteQuery<SearchResultView>(sb.ToString()); 

Problem behoben Dank für die Unterstützung.

1

so etwas schreiben? Obwohl Sie versuchen, auf FeatureSetId 1, 2 und 3 zu entsprechen? Ich behielt es so, wie es ist, aber sie können in ein OR geändert werden (||), wenn das genau das ist, was du meintest?

var results = (from r in db.SearchResultViews 
       join v in db.VehicleFeatureSet 
       on r.ID equals v.VehicleID 
       where r.Active 
        && v.FeatureSetID == 1 
        && v.FeatureSetID == 2 
        && v.FeatureSetID == 3 
       select r.ID) 
       .ToList(); 

Edit: Okay, was ich jetzt einfach Ihre foreach-Anweisung neu geschrieben getan haben, können Sie es mit dem folgenden ersetzen:

results = features 
    .Aggregate(results, (current, feature) => current 
     .Where(v => v.VehicleFeatureSets 
      .Any(vf => vf.VehicleFeatureSetId == feature)) 
     .ToList()); 
+0

Hallo Danke für die Antwort, aber ich kann diese Anfrage nicht schreiben. Ich habe Array von FeatureSetID. Es gibt dynamische Werte. – halit

+0

Ah okay, überprüfen Sie meine Bearbeitung, die die VehicleFeatureSets-Eigenschaft für das Fahrzeug verwendet und die Feature-Liste verwendet, die in Ihrem Code definiert wurde. Hoffe das hilft – mattytommo

+0

Hallo @mattytommo danke für Hilfe. Ich habe einen Fehler bekommen. "Die lokale Sequenz kann in LINQ to SQL-Implementierungen von Abfrageoperatoren mit Ausnahme des Contains-Operators nicht verwendet werden." "Any" -Operator wurde nicht akzeptiert. – halit