【问题标题】:Using a .Contains in an Object Array在对象数组中使用 .Contains
【发布时间】:2021-08-28 16:08:04
【问题描述】:

我有一个对象数组,像这样:

accounts = new[]
{
    new Account
    {
        AccountId = 1,
        Name = "Account 1"
    },
    new Account
    {
        AccountId = 2,
        Name = "Account 2"
    }
}

我正在尝试运行此布尔检查:

var canAccess = _context.Class
         .Where(x => x.Active)
         .Where(x => x.ClassId)
         .Any(x => accounts.Select(y => y.AccountId).Contains(x.AccountId)

我在我们的数据库中验证了现有的类是活动的并且与 ClassId 匹配,并且还有一个与对象数组中的内容匹配的 AccountId。但是,它并没有越过那条线(并且没有提供任何有用的错误)

我使用的语法有效吗?

【问题讨论】:

  • ClassId 是布尔变量吗?因为你只是用.Where(x => x.ClassId)而不是.Where(x => x.ClassId == someIdValue)来检查它
  • 并且没有提供任何有用的错误 它是否提供了任何错误?如果是这样,你应该在这里发帖。如果没有,您应该发布带​​有示例输入和预期输出的minimal reproducible example。另外,你错过了一个 ); 吃完了。
  • 您可以运行配置文件并检查正在形成的查询
  • 您使用的是什么 LINQ:LINQ to EF 6.x / EF Core 2.0 / 2.1 / 3.x / 5.x / 6.x?什么数据库提供商?

标签: c# arrays linq linq-to-entities


【解决方案1】:

我会做以下事情:

 var ids = accounts.Select(x => x.AccountId);
 var canAccess = _context.Class.Select(y => ids.Contains(y.AccountId )).Contains(true);

【讨论】:

  • 您需要在最后执行 ToListToArray 以使 ids 成为一个 concreate 集合,以便它与 EF 一起使用。
  • 没有必要,因为帐户是一个匿名对象数组。当数据来自数据库查询或者您需要该对象成为列表时,您应该执行 .ToList() 。 ids 被转换为一个 IEnumerable 。使用该选择,并且应该在没有 .ToList() 的情况下工作
猜你喜欢
  • 2018-07-01
  • 1970-01-01
  • 2019-07-29
  • 2017-09-07
  • 2019-03-19
  • 2015-02-26
  • 2012-02-19
  • 2013-12-16
  • 2021-04-29
相关资源
最近更新 更多