用另一个实体过滤实体

Posted

技术标签:

【中文标题】用另一个实体过滤实体【英文标题】:Filtering entity with another entity 【发布时间】:2022-01-09 05:31:22 【问题描述】:

我试图用这种方法过滤一个实体和另一个实体:

         [HttpGet]
    public async Task<IActionResult> GetViewIO()
    
        int uid = (int)HttpContext.Session.GetInt32("userId").Value;

        if(uid == 2)
        
            uid = 33;
        

        var listAeGrp = _context.ListofAE.FromSql($"Execute ListOfAe uid");
        var _orders = _context.OrderHeaderView.FromSql(@"OrderHeaderView").OrderByDescending(f => f.id).OrderBy(p => p.platform_id);

        var orders = await _orders.Where(x => listAeGrp.Any(y => y.id == x.created_by)).ToListAsync();
        
        return Json(orders);
    

所以基本上,我使用 FromSQL 和 MSSQL 中的存储过程获取 listAeGrp 和 _orders 的值。 listAeGrp 依赖于当前登录的用户,而 _orders 则创建了一个简单的数据选择。

使用这个单独的变量,我可以检查它们是否具有值,但是当我使用 .Any linq 进行过滤时,会返回错误:

无法解析表达式'value(Microsoft.Data.Entity.Query.Internal.EntityQueryable`1[DigitalMVC.API.Models.listofAE]).FromSql("Execute ListOfAe 33", value(System.Object[]) )':目前不支持“Microsoft.Data.Entity.RelationalQueryableExtensions.FromSql”方法的这种重载。

我目前用的是VS2015,dnx4.5.1

所以我的问题是:

    我哪里出错了?我对 MVC 和 Linq 还很陌生。 还有其他方法吗?

非常感谢您的帮助!

【问题讨论】:

小心FromSql;用它很容易意外启用sql注入 那么,ListOfAe 到底是什么?什么样的数据库可编程性? @CaiusJard 这是一个用于过滤 _orders 的 ID 列表 显然,我不必使用实体来过滤另一个实体。我所做的是,我创建了一个返回 ListOfAe 的 List 的函数。然后使用此 list 过滤订单。 OrderHeaderView.FromSql(@"OrderHeaderView").Where(x =&gt; allowedUserId.Contains(x.created_by)) 您可以将其发布为答案;帮助未来有类似问题的人并让你投票.. 【参考方案1】:

我所做的不是使用实体来过滤另一个实体,而是创建了一个返回 int 列表的函数

public List<int>ListOfUsers(int uid)
    

        List<int> listOfAeGroup = new List<int>();
        var listAeGrp = _context.ListofAE.FromSql($"Execute ListOfAe uid");
        listOfAeGroup = listAeGrp.Select(x => x.id).ToList();
        return listOfAeGroup;

    

然后我用了返回的函数,这样使用:

List<int> allowedUserId = ListOfUsers(uid);    
var orders = await _context.OrderHeaderView.FromSql(@"OrderHeaderView").Where(x => allowedUserId.Contains(x.created_by)).OrderByDescending(f => f.id).OrderBy(p => p.platform_id).ToListAsync();
            return Json(orders);

【讨论】:

以上是关于用另一个实体过滤实体的主要内容,如果未能解决你的问题,请参考以下文章

如何使用谓词过滤子实体集合?

EF Core选择由相关实体过滤的一个实体

设计一个休息网址 - 在实体(不是最后一个实体)上使用多个参数进行过滤

递归算法应用——实体树过滤解析

过滤多对多关系,其中一个实体与所有其他实体有关系,而不仅仅是一些实体

symfony 5 表单实体类型过滤器选择基于选择的其他实体类型选择