2012-03-30 3 views
1

Привет У меня есть массив Featureset Id, Мой автомобиль таблица имеет вспомогательный стол как FeatureSets я написал SQL запросов, какLinqToSql Sub Entiity Multiple И Операторы

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 

Я пытался. не Но я могу

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)); 
      } 

Как я могу написать это LINQ Query

+1

Как указано в Mattytommo, ваш SQL-запрос содержит предикат, который всегда является ложным ('t1.FeatureSetID = 1 и ...'). Самое смешное, я думаю, что ваш linq делает именно то, чего вы хотите достичь, но, разумеется, произведенный SQL отличается. Я думаю, что он содержит 'EXISTS', но он должен содержать их. Это в предположении, что вы хотите, чтобы записи «SearchResultView» имели _both_ 1 _and_ 2 _and_ 3 в их «VehicleFeatureSet». –

ответ

1

я преобразовал мою Linq запрос для SQL Query. На самом деле, я не мог писать LINQ запрос для этого :)

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()); 

Исправлена ​​проблема спасибо за помощь.

1

Что-то вроде этого? Хотя вы пытаетесь сопоставлять FeatureSetId с 1, 2 и 3? Я сохранил это как есть, но они могут быть заменены на OR (||) вместо этого, если это то, что вы имели в виду?

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: Хорошо, что я в настоящее время сделать это просто переписать ваш Еогеасп заявление, вы можете заменить его следующим:

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

Привет, спасибо за ответ, но я не могу написать этот запрос. У меня есть массив FeatureSetID. Существуют динамические значения. – halit

+0

Ну ладно, проверьте мое редактирование, которое использует свойство VehicleFeatureSets на транспортном средстве и использует список функций, который был определен в вашем коде. Надеюсь, что поможет – mattytommo

+0

Привет @mattytommo спасибо за помощь. У меня ошибка. «Локальная последовательность не может использоваться в реализациях LINQ to SQL операторов запросов, кроме оператора Содержит». Он не принимал оператора «Любой» – halit

Смежные вопросы