2011-11-03 45 views
0

我有一個大的Linq到實體查詢,並且將該linq查詢轉換爲SQL似乎很長。大型實體框架查詢,如何預生成或預編譯此查詢

如何預編譯此查詢。 有沒有辦法做到這一點?


這裏是我的查詢。

var ListLocation = from s in repLocation.GetLocationByPermision() 
            .Where(p => (ViewModel.BaseSearchViewModel.IsActive == -1 || p.IsActive == bIsActive) && 
                (ViewModel.LocationTypeID < 0 || ViewModel.LocationTypeID == p.LocationTypeID) && 

                (ViewModel.ListUsageID.Count() == 0 || p.Premises.Select(gs => gs.UsageID).Intersect(ViewModel.ListUsageID).Any()) && 
                (ViewModel.BaseSearchViewModel.City == null || p.Address.City.CityName.Contains(ViewModel.BaseSearchViewModel.City)) && 
                (ViewModel.BaseSearchViewModel.ListCountryID.Count() == 0 || ViewModel.BaseSearchViewModel.ListCountryID.Any(pl => pl == p.Address.City.Province.Country.CtryID)) && 
                (ViewModel.BaseSearchViewModel.ListStateID.Count() == 0 || ViewModel.BaseSearchViewModel.ListStateID.Any(pl => pl == p.Address.City.Province.PrvID)) && 
                (ViewModel.BaseSearchViewModel.Street == null || p.Address.Street.Contains(ViewModel.BaseSearchViewModel.Street)) && 
                (ViewModel.BaseSearchViewModel.CivicNumber == null || p.Address.CivicNumber.Contains(ViewModel.BaseSearchViewModel.CivicNumber)) && 
                (ViewModel.BaseSearchViewModel.ListGrpDescID1.Count() == 0 || p.GroupLocations.Select(sg => sg.GrpDescID).Intersect(ViewModel.BaseSearchViewModel.ListGrpDescID1).Any()) && 
                (ViewModel.BaseSearchViewModel.ListGrpDescID2.Count() == 0 || p.GroupLocations.Select(sg => sg.GrpDescID).Intersect(ViewModel.BaseSearchViewModel.ListGrpDescID2).Any()) && 
                (ViewModel.BaseSearchViewModel.ListGrpDescID3.Count() == 0 || p.GroupLocations.Select(sg => sg.GrpDescID).Intersect(ViewModel.BaseSearchViewModel.ListGrpDescID3).Any()) && 
                (ViewModel.BaseSearchViewModel.ListGrpDescID4.Count() == 0 || p.GroupLocations.Select(sg => sg.GrpDescID).Intersect(ViewModel.BaseSearchViewModel.ListGrpDescID4).Any()) 


                 ) 
           select new LocationViewModel() 
           { 
            LocationID = s.LocationID, 
            LocationTypeID = s.LocationTypeID, 
            Long = s.Address.Longitude, 
            Lat = s.Address.Latitude, 
            FileNumber = s.LocationFile, 
            State = s.Address.City.Province.PrvName, 
            City = s.Address.City.CityName, 
            Address = s.Address.CivicNumber + " " + s.Address.Street, 
            Status = s.LocationType.LocationTypeTexts.FirstOrDefault(p => p.LangID == lang).Txt, 
            DefaultImgPath = s.LocationPictures.FirstOrDefault(p => p.IsDefault == true && p.IsActive == true).FilePath, 
            Location = s, 
            HasPremises = s.Premises.Any(p => p.IsActive == true && p.IsDelete == false), 
            ListGrpDescID = s.GroupLocations.Select(g => g.GrpDescID) 
           }; 

回答