Как получить значение из Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable в контроллере mvc - PullRequest
0 голосов
/ 18 января 2019

Я знаю, что название несколько сложнее, но позвольте мне очистить название, объяснив проблему.

По изображению я хочу отфильтровать название товара в текстовом поле поиска. Например: в текстовом поле поиска, если я введу масло, в целых данных, для которых требуется дата, нужно указать, какое название продукта является маслом.

Для фильтра я использовал запрос linq, вот мой код,

var dataList = (from x in query
    select new
    {
        PartName = _Db.Part.Where(z => z.Id == x.Select(p => p.PartId).FirstOrDefault()).Select(p => p.Name),
        ManufacturerName = _Db.Manufacture.Where(z => z.Id == x.Select(p => p.ManufacturerId).FirstOrDefault()).Select(p => p.name),
        CategoryName = _Db.Category.Where(z => z.Id == x.Select(p => p.CategoryId).FirstOrDefault()).Select(p => p.Name),
        Pcs = x.Sum(o =>o.Pcs) - 
        (from m in _Db.MaterialRecord
           join s in _Db.ServiceJob on m.ServiceJobId equals s.Id
           where m.pid == x.Select(p => p.PartId).FirstOrDefault()
           select m).Sum(z => z.Qty),
        Weight = _Db.Purchase.Where(p => p.Weight == x.Select(s => s.Weight).FirstOrDefault()).Select(a => a.Weight).FirstOrDefault(),      
        WeightType = x.Select(p => p.WeightTypeId).FirstOrDefault() > 0 ?((WeightType)x.Select(p => p.WeightTypeId).FirstOrDefault()).ToString() :"",
    }).ToList();

//Search    
if (!string.IsNullOrEmpty(searchValue))
    dataList = dataList.Where(m => m.CategoryName.Contains(searchValue.ToString().ToLower())).ToList();

//Returning Json Data
return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data });

Согласно коду, я получаю целые данные в переменной списка данных. Теперь, когда я буду искать любой продукт в окне поиска, условие поиска будет истинным, и после этого значение списка данных будет нулевым [как показано при отладке кода].

Итак, отсюда из этой таблицы данных показаны нулевые данные.

Для понимания того, почему это происходит, я добавляю tostring () в запрос к списку данных строки категории, т.е.

CategoryName = _Db.Category.Where(z => z.Id == x.Select(p => p.CategoryId).FirstOrDefault()).Select(p => p.Name).toString(),

После добавления toString () в этой строке отображается эта строка Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable . Но я хочу значение результата этой строки. Для большей наглядности посмотрим на другое изображение

enter image description here

Это масло значение результата, которое я хочу в строке условия поиска, т.е.

dataList = dataList.Where(m => m.CategoryName.Contains(searchValue.ToString().ToLower())).ToList();

но сейчас в нем отображается эта строка Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable вместо значения результата.

1 Ответ

0 голосов
/ 21 января 2019

Первое, что вы должны знать, это ToString(). По умолчанию реализация возвращает полное имя объекта применительно к объектам коллекции, в этом случае возвращает Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable<string>, который является ссылочным типом, который не не отменять этот метод.

Давайте сначала оценим это выражение:

CategoryName = _Db.Category.Where(z => z.Id == x.Select(p => p.CategoryId).FirstOrDefault())
                           .Select(p => p.Name),

Предполагается, что Category имеет тип DbSet<Category>, метод расширения Select(), использованный в приведенном выше коде, возвращает EntityQueryable<string>, который содержит коллекцию результирующего набора из выполненного оператора SQL, предоставленного запросом LINQ-to-Entities. Если вы хотите извлечь одно строковое значение из этой коллекции, вы должны использовать один из методов расширения First(), Single(), FirstOrDefault() или SingleOrDefault().

Следовательно, вы должны добавить метод расширения, как указано выше, чтобы возвращать строковое значение вместо коллекции:

var dataList = (from x in query
    select new {
        // other properties

        CategoryName = _Db.Category.Where(z => z.Id == x.Select(p => p.CategoryId).FirstOrDefault())
                               .Select(p => p.Name).SingleOrDefault(),

        // other properties
    }).ToList();

Тогда вы можете использовать Contains против подстроки (searchValue), потому что CategoryName имеет строковый тип:

dataList = dataList.Where(m => m.CategoryName.Contains(searchValue.ToString().ToLower())).ToList();

Справка:

Entity Framework / Core и LINQ to Entity Методы запросов (операторы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...