大型实体框架查询,如何预生成或预编译此查询

问题描述:

我有一个大的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) 
           }; 

你想要的是预编译的LINQ。还有的话题在这里像样的MSDN文章: http://msdn.microsoft.com/en-us/magazine/ee336024.aspx

我发现的过程有点繁琐,并且发现自己恢复到存储过程查询的福我需要写引起你的复杂程度。

从微软预编译观为指导可能是你最好的选择:

How to: Pre-Generate Views to Improve Query Performance

+0

我已经在为.edmx文件做这件事。这里的问题是,没有任何东西可以解释如何预先生成存储在存储库文件中的自定义查询。 –