none
sqlite database AsQueryable ve ToList RRS feed

  • Soru

  • Merhaba,

    veri tabanı olarak sqlite kullanıyorum. aşağıdaki AsQueryable kullanmazsam ve ToList olarak değiştirirsen büyük küçük fark ayrımı olmadan aramalarımı yapabiliyorum. sorun çıkartmıyor çünkü aramalarımı tolower olarak yapıyorum - veritabanında. 

    AsQueryable ile ilgili sorun çıkartmaması gerekiyor. ama neden sorun çıktığını anlayamadım. 

            [AllowAnonymous]
            [HttpPost]
            public JsonResult GetReports(string publisher = null, string tag = null)
            {
                try
                {
                    var draw = Request.Form["draw"].FirstOrDefault();
                    var start = Request.Form["start"].FirstOrDefault();
                    var length = Request.Form["length"].FirstOrDefault();
                    var sortColumn = Request.Form["columns[" + Request.Form["order[0][column]"].FirstOrDefault() + "][name]"].FirstOrDefault();
                    var sortColumnDirection = Request.Form["order[0][dir]"].FirstOrDefault();
                    string searchValue = Request.Form["search[value]"].FirstOrDefault().ToLower();
    
                    int pageSize = length != null ? Convert.ToInt32(length) : 0;
                    int skip = start != null ? Convert.ToInt32(start) : 0;
                    int recordsTotal = 0;
    
                    var customerData = _unitOfWork.Reports.GetAll().Include(i => i.Publisher).Include(i => i.ReportTags).ThenInclude(i => i.Tag)
                                                                   .Where(i => i.IsApproved && i.Language.Culture == CultureInfo.CurrentCulture.Name)
                                                                   .OrderByDescending(i => i.ReleaseDate).AsQueryable();
                    if (!(string.IsNullOrEmpty(sortColumn) && string.IsNullOrEmpty(sortColumnDirection)))
                    {
                        customerData = customerData.OrderBy(s => sortColumn + " " + sortColumnDirection).AsQueryable();
                    }
                    if (!string.IsNullOrEmpty(searchValue))
                    {  
                        customerData = customerData.Where(m => m.Title.ToLower().Contains(searchValue)
                                           || m.Summary.ToLower().Contains(searchValue)
                                           || m.Publisher.Name.ToLower().Contains(searchValue)
                                                    ).AsQueryable();
                    }
                    if (!string.IsNullOrEmpty(publisher))
                    {
                        customerData = customerData.Where(p => p.Publisher.Url == publisher).AsQueryable();
                    }
                    if (!string.IsNullOrEmpty(tag))
                    {
                        customerData = customerData.Where(t => t.ReportTags.Any(a => a.Tag.Url.Equals(tag))).AsQueryable();
                    }
                    recordsTotal = customerData.Count();
                    var data = customerData.Skip(skip).Take(pageSize)
                                            .Select(i => new { id = i.ReportId, title = i.Title, summary = i.Summary, releaseDate = i.ReleaseDate.GetValueOrDefault().ToString("dd.mm.yyyy"), publisherName = i.Publisher.Name, url = i.Url })
                                            .ToList();
                    var jsonData = new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data };
                    return Json(jsonData);
                }
                catch
                {
                    return Json("");
                }
            }
    

    29 Ocak 2022 Cumartesi 08:43

Tüm Yanıtlar

  • Merhaba,

    AsQueryable ve ToList arasındaki farkı aşağıda örnekleklendirilmiş ve açıklanmıştır. İnceleyebilirsiniz.

    https://stackoverflow.com/questions/17968469/whats-the-differences-between-tolist-asenumerable-asqueryable

    https://stackoverflow.com/questions/17366907/what-is-the-purpose-of-asqueryable

    31 Ocak 2022 Pazartesi 07:12
    Moderatör
  • Teşekkürler Yusuf hocam 

    Breakpoint ile kodun çalışma şeklini görebiliyorum. yapmak istediğim ToList() performans kaybını önlemek. Querynin çalışmasını en son sağlamak istiyorum. görüldüğü gibi data değişkenine atadığım yerde tolist diyerek veritabanından veri çekiliyor. Bu ms-sqlde sorunsuz çalışıyor tolower ile aradığım kelimedeki büyük küçük harf duyarlılığı ortadan kalkıyor. Sql Profiller ile de sorunsuz olduğunu ve yapmak istediğim gibi tek seferde veritabanından istediğim datayı çeken query hazırlanmış olduğunu görüyorum. 

    Aynı yapı veri tabanı olarak sqlite olarak kullandığımda, büyük küçük harf duyarlılığı kaldıran tolower özelliği çalışmıyor. Queryable olan yerleri ToList olarak değişrirsem yani tolower çalıştırdığım yerde ToList deme zorunluluğu oluşuyor - çalışması için...

    Sorum şu ms sql olarak sorunsuz çalışan m.Title.ToLower().Contains(searchValue.ToLower()) aynı kod yapısı ile sqlite olarak neden çalışmaz ? tolower çalışması için ToList() vermem gerekiyor? çözebilmiş değilim. 


    • Düzenleyen suat suphi 1 Şubat 2022 Salı 15:14
    1 Şubat 2022 Salı 15:13