如何从MVC控制器中的Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable获取值 [英] How to get value from Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable in mvc controller

查看:810
本文介绍了如何从MVC控制器中的Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable获取值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道标题有些复杂,但是让我通过解释问题来清除标题。

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();

参考:

实体框架/核心和LINQ到实体的查询方法(操作员)

这篇关于如何从MVC控制器中的Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable获取值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆