如何从MVC控制器中的Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable获取值 [英] How to get value from Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable in mvc controller
问题描述
我知道标题有些复杂,但是让我通过解释问题来清除标题。
I know the title is somewhat complicate but let I clear the title by explaining the problem.
根据图片我想在搜索文本框中过滤产品名称。例如:在搜索文本框中,如果我在数据表中输入的油是整个数据想要显示哪个产品名称是油。
As per image I want to filter product name in search textbox. For ex: In search textbox if I enter the oil that in datatable whole data want to show which product name is oil.
对于过滤器,我使用linq查询,这是我的代码,
For filter I used linq query, here is my code,
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 });
根据代码,我正在datalist变量中获取整个数据。现在,当我那时在搜索框中搜索任何产品时,搜索的条件将为true,此后数据列表值将为null(如调试代码所示)。
As per code I am getting whole data in datalist variable. Now, when I search any product in searchbox at that time the condition of search will true and after that the datalist value will be null[as shown by debug the code].
因此,因此从该数据表中显示空数据。
So, hence from that datatable shows null data.
为了理解为什么会发生这种情况,我在类别的数据列表查询中添加了 tostring()行,即
For understanding that why this happening I add the tostring() in datalist query of category line i.e.
CategoryName = _Db.Category.Where(z => z.Id == x.Select(p => p.CategoryId).FirstOrDefault()).Select(p => p.Name).toString(),
在此行中添加 toString()后,它将显示此行 Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable 。但是我想要这条线的结果值。为了更清晰,让我们看一下另一张图片
After adding toString() in this line it shows this line Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable. But I want the result value of this line. For more clear lets see the another image
我要在搜索条件行中找到的 oil 结果值,即
That oil result value I want in search condition line i.e.
dataList = dataList.Where(m => m.CategoryName.Contains(searchValue.ToString().ToLower())).ToList();
但现在其中显示此行 Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable 代替结果值。
but right now in it is showing this line Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable in the place of result value.
推荐答案
您应该知道的第一件事是 ToString()
的默认实现是在应用于集合对象时返回对象的标准名称,在这种情况下,返回 Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable< string>
是不覆盖该方法的引用类型。
First thing you should know is ToString()
by its default implementation returns fully-qualified name of the object when applied to collection objects, in this case returns Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable<string>
which is a reference type that doesn't override that method.
让我们首先评估该表达式:
Let's evaluate this expression first:
CategoryName = _Db.Category.Where(z => z.Id == x.Select(p => p.CategoryId).FirstOrDefault())
.Select(p => p.Name),
假定类别
具有 DbSet< Category> ;
类型,上面代码中使用的 Select()
扩展方法返回 EntityQueryable< string>
,其中包含LINQ-to-Entities查询提供的已执行SQL语句的结果集集合。如果要从该集合中提取单个字符串值,则必须使用 First()
, Single()
, FirstOrDefault()
或 SingleOrDefault()
扩展方法。
Assumed that Category
has DbSet<Category>
type, the Select()
extension method used in code above returns EntityQueryable<string>
which contains result set collection from executed SQL statement provided by LINQ-to-Entities query. If you want to pull single string value from that collection, you must use one of the First()
, Single()
, FirstOrDefault()
or SingleOrDefault()
extension methods.
因此,您应该如上所述添加扩展方法以返回字符串值而不是集合:
Hence, you should add extension method as mentioned above to return a string value instead of a collection:
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
具有字符串类型:
Then you can use Contains
against a substring (searchValue
) because CategoryName
has string type:
dataList = dataList.Where(m => m.CategoryName.Contains(searchValue.ToString().ToLower())).ToList();
参考:
这篇关于如何从MVC控制器中的Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable获取值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!