LinqToSql Sub Entity Multiple и операторы - PullRequest
1 голос
/ 30 марта 2012

Привет, у меня есть массив идентификаторов Featureset, в таблице «Мои автомобили» есть подтаблица как FeatureSets. Я написал Sql Query Like

    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

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Я преобразовал свой запрос LInq в запрос Sql. На самом деле, я не мог написать LINQ Query для этого:)

 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 голос
/ 30 марта 2012

Как то так? Хотя вы пытаетесь найти соответствие FeatureSetId, равное 1, 2 и 3? Я сохранил все как есть, но вместо этого их можно заменить на ИЛИ (||), если вы это имели в виду?

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

Редактировать: Хорошо, теперь я просто переписал ваше утверждение foreach, вы можете заменить его следующим:

results = features
    .Aggregate(results, (current, feature) => current
        .Where(v => v.VehicleFeatureSets
            .Any(vf => vf.VehicleFeatureSetId == feature))
        .ToList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...