Hello,
I have a linq to sql question:
tmpAdList1 = (from p in context.Ads join h in context.AdCategories on p.CategoryId equals h.Id join l in context.Location on p.UserLocationId equals l.Id where (adList.S == null || adList.S.Length < 1 || p.Title.Contains(adList.S) || p.Description.Contains(adList.S)) && (categorylevelOrder.Length < 1 || h.LevelOrder.StartsWith(categorylevelOrder)) && ((locationIdList != null && lList.Contains(l.Id)) || (locationLevelOrder.Length < 1 || l.LevelOrder.StartsWith(locationLevelOrder))) && ((adTypeO1 == AdType.Unknown && adTypeO2 == AdType.Unknown && adTypeO3 == AdType.Unknown && adTypeO4 == AdType.Unknown && adTypeO5 == AdType.Unknown) || (p.TypeOfAd == (int)adTypeO1 || p.TypeOfAd == (int)adTypeO2 || p.TypeOfAd == (int)adTypeO3 || p.TypeOfAd == (int)adTypeO4 || p.TypeOfAd == (int)adTypeO5)) &&
See Edit1 for the whole method.
After this question is launched, another filtering will be carried out (in context), but to do this as quickly as possible, I try to extract as few records as possible from the SQL server in the first question.
The problem is that I need to compare locationIdList, which is an int [] for the object. The exception is:
Unable to compare elements of type 'System.Int32 []'. Only primitive types (such as Int32, String, and Guid) and entity types are supported.
I have a problem with Google and this is a known issue, however I found examples like this:
var list = new List<int> { 1, 2, 3, 5 }; var result = from s in DB.Something where list.Contains(s.Id) select s;
But does this cause the same exception? I also read that a stored procedure can solve the problem, but I did not find how it works?
Any suggestions?
Best regards
Edit1: The whole method:
public List<Ad> GetAds(AdList adList, DateTime fetchAdsTo, out int totalAds) { AdType adTypeO1 = AdType.Unknown; AdType adTypeO2 = AdType.Unknown; AdType adTypeO3 = AdType.Unknown; AdType adTypeO4 = AdType.Unknown; AdType adTypeO5 = AdType.Unknown; int? adOwnerType1 = null; int? adOwnerType2 = null; FilterModel filterModel = new FilterModel(); List<AdCategoryFilter> adCategoryFilterList; AdsFilterValues adsFilterValues; List<AdsFilterValueWrapper> seartchFilterValueList; AdsFilterValueWrapper seartchFilterValue = null; List<Ad> tmpAdList1; List<Ad> tmpAdList2 = new List<Ad>(); int locationId = -1; int[] locationIdList = null; string locationLevelOrder = string.Empty; int categoryId = -1; string categorylevelOrder = string.Empty; AdCategoryFilter adCategoryFilter; AdListCompare adListCompare; Boolean firstDropDownMatch = false; Boolean secondDropDownMatch = false; totalAds = 0; int machedFilterCount; categoryId = AdHandler.Instance.ExtractCategoryId(adList.CS);
Edit 2: update
main getAd method :
public List<Ad> GetAds(AdList adList, DateTime fetchAdsTo, out int totalAds) { LocationModel locationModel = new LocationModel(); FilterModel filterModel = new FilterModel(); List<AdCategoryFilter> adCategoryFilterList; List<AdsFilterValueWrapper> seartchFilterValueList; int categoryId = -1; List<Ad> outputList; totalAds = 0; #region Fetch the first ads by location outputList = GetAdsByLocations(locationModel.GetLocationOrderList(adList.GetLocationIds()), fetchAdsTo, false); if(outputList.Count < 1) return outputList; #endregion #region GetFilters categoryId = AdHandler.Instance.ExtractCategoryId(adList.CS); adCategoryFilterList = filterModel.GetCategoryFilterByCategory(categoryId); seartchFilterValueList = FilterHandler.Instance.ConvertAdFilterToModel(adList.F, adCategoryFilterList, FilterType.Display); #endregion #region Filter Default filters (Buy, Let, Sell, Swap, WishRent) FilterDefaultCustomFilters(outputList, adCategoryFilterList, seartchFilterValueList); if (outputList.Count == 0) return outputList; else { #region Remove default filters fom filterList adCategoryFilterList = adCategoryFilterList.Where(c => ((PublicAdFilterKey)c.PublicAdFilterKey) != PublicAdFilterKey.Buy && ((PublicAdFilterKey)c.PublicAdFilterKey) != PublicAdFilterKey.Let && ((PublicAdFilterKey)c.PublicAdFilterKey) != PublicAdFilterKey.Sell && ((PublicAdFilterKey)c.PublicAdFilterKey) != PublicAdFilterKey.Swap && ((PublicAdFilterKey)c.PublicAdFilterKey) != PublicAdFilterKey.WishRent).ToList(); #endregion } #endregion #region Filter Custom filters this.FilterCustomFilters(outputList, adCategoryFilterList, seartchFilterValueList); #endregion #region Order switch ((AdListOrderBy)adList.ALS.OB) { case AdListOrderBy.Price: outputList = outputList.OrderBy(c => c.Price).ToList(); break; case AdListOrderBy.Latest: outputList = outputList.OrderByDescending(c => c.PublishedDate).ToList(); break; } #endregion #region Total Ad Count totalAds = outputList.Count(); #endregion #region Paging outputList = outputList.Skip((adList.ALS.P - 1) * adList.ALS.CP).Take(adList.ALS.CP).ToList(); #endregion return outputList; }
GetAdByLocation
public List<Ad> GetAdsByLocations(string[] locationLevelOrderList, DateTime? fetchAdsTo, Boolean inactive) //, List<Ad> adList = null) { List<Ad> output; using (BissEntities context = new BissEntities()) { if (fetchAdsTo.HasValue) { if (locationLevelOrderList.Count() == 0) { output = (from a in context.Ads join l in context.Location on a.UserLocationId equals l.Id where a.InactivatedDate.HasValue == inactive && (a.PublishedDate.HasValue && a.PublishedDate.Value.CompareTo(fetchAdsTo.Value) >= 1) select a).ToList(); } else { output = (from a in context.Ads join l in context.Location on a.UserLocationId equals l.Id where a.InactivatedDate.HasValue == inactive && (a.PublishedDate.HasValue && a.PublishedDate.Value.CompareTo(fetchAdsTo.Value) >= 1) && (locationLevelOrderList.Where(c => l.LevelOrder.StartsWith(c)).FirstOrDefault() != null) select a).ToList(); } } else { if (locationLevelOrderList.Count() == 0) { output = (from a in context.Ads join l in context.Location on a.UserLocationId equals l.Id where a.InactivatedDate.HasValue == inactive select a).ToList(); } else { output = (from a in context.Ads join l in context.Location on a.UserLocationId equals l.Id where a.InactivatedDate.HasValue == inactive && (locationLevelOrderList.Count() == 0 || locationLevelOrderList.Where(c => l.LevelOrder.StartsWith(c)).FirstOrDefault() != null) select a).ToList(); } } } return output; }
Note. Methods basically GetAd that start with the filter name will only work with the collection (no database actions)