【问题标题】:Dynamic where clause with two entity具有两个实体的动态 where 子句
【发布时间】:2017-11-29 14:21:15
【问题描述】:

我需要两个实体之间的过滤器。 有两张表 1.User 2.Product 带有 User 表的产品图。

我将创建一个动态 where 过滤器。

我需要找出所有拥有“测试”产品的用户。

条件:如果 userFilter 计数为 0,那么我需要所有受尊敬用户的测试产品。

如果 userFilter 存在且 productFilter 存在,则下面的代码正在工作,但如果 userFilter 不存在且 productFilter 存在,则它返回 0 行。如何找到有测试产品的用户? ?

这是我的代码。

public IHttpActionResult GetFilter()
        {
            var userFilters = new List<Filter>()
            {
                new Filter { PropertyName = "Username" ,
                    Operation = Op .Equals, Value = "Karan"  },
            };

            var productfilter = new List<Filter>()
            {
                new Filter { PropertyName = "Name" ,
                    Operation = Op .Equals, Value = "Test product"  }
            };

            Func<User, bool> deleg = x => true;
            Func<Product, bool> delegProduct = x => true;

            if (userFilters.Count > 0)
            {
                deleg = ExpressionBuilder.GetExpression<User>(userFilters).Compile();
            }

            if (productfilter.Count > 0)
            {
                delegProduct = ExpressionBuilder.GetExpression<Product>(productfilter).Compile();
            }

            var resultt = _localmarketEntities.Users.Where(deleg)
                .Select(x => new
                {
                    x.Id,
                    x.Username,
                    Product = x.Products.Where(delegProduct).Select(y => new
                    {
                        y.Id,
                        y.Name
                    }).ToList()
                })
                .ToList();

            return Ok(resultt);
        }

【问题讨论】:

  • 不确定为什么用实体框架标记这是所有 Linq 到对象的东西。除非您不打算在内存中进行所有过滤?无论如何,如果您从代码中删除 .Where(deleg) 会发生什么,这应该与没有过滤器相同,它仍然没有返回任何内容吗?
  • 如果有userFilter那么我需要使用deleg。这就是为什么存在。因此,如果我将其删除,则无法通过 userFilter 对其进行过滤。有意义吗?
  • userFilter 不存在”是什么意思?
  • 考虑 userFilter 什么都没有。表示没有与用户相关的过滤器。 Func deleg = x => true;默认会执行。
  • 那么你的代码看起来很好,我认为问题不在你想的地方——也许得到 LINQPad 或使用调试器,看看当userFilters.Count 为零时_localmarketEntities.Users.Where(deleg).Count() 返回什么。

标签: linq linq-to-entities linq-to-objects


【解决方案1】:

如果我理解正确,当 userFiler 计数为 0 时,您需要所有拥有测试产品的用户。

List<User> res;
var user = _localmarketEntities.Users.Where(deleg).ToList();
if (user.Count == 0) {
    res = _localmarketEntities.Products.Where(delegProduct).Select(q => new User() {
       Id = q.Id,
       Username = q.Username,
       Product = q
    }).ToList();
}
else {
    res = _localmarketEntities.Users.Where(deleg)
          .Select(x => new
          {
              x.Id,
              x.Username,
              Product = x.Products.Where(delegProduct).Select(y => new
              {
                  y.Id,
                  y.Name
              }).ToList()
            })
            .ToList();
}

【讨论】:

    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多