2012-03-30 9 views
1

こんにちは、私はFEATURESET Idの配列を持って、私の車の表は、FeatureSets としてサブテーブルを持っている私は、SQLクエリと同様に LinqToSqlサブEntiity複数と演算子

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クエリ

+1

Mattytommoによって指摘されているように、SQLクエリには常に偽( 't1.FeatureSetID = 1 and ...')する述語が含まれています。面白いのは、私はあなたのlinqが達成したいものとまったく同じだと思いますが、もちろん生成されるSQLは異なります。私はそれに '存在 'が含まれていると思うが、それを含んでいるはずだ。これは、 'VehicleFeatureSet'に_both_ 1 _and_ 2 _and_ 3を持つ' SearchResultView'レコードが必要であるという前提の下でです。 –

答えて

1

は、私はSQLクエリに私のLINQクエリを変換します。 実は、私はこのために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

何かを書き込むことができませんでしたか? 1、2、3のFeatureSetIdにマッチさせようとしていますか?私はそれをそのまま残しましたが、それはあなたが意味するものであれば、代わりに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(); 

編集:さて、私は今、単にあなたのforeach文を書き換えている何をやったか、あなたは次のように置き換えることができます。

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助けてくれてありがとう。私は誤りがある。 "ローカルシーケンスは、Contains演算子以外のクエリ演算子のLINQからSQLへの実装では使用できません。 "Any"演算子を受け入れませんでした – halit