Linq 包含整数数组

Linq Contains for Integer Array

我需要根据 Linq C# 中的 ID 从 Table 中获取记录。 Linq 有 Contains,它适用于 String,但任何人都可以帮助我如何使用整数数组实现它。

int[] ServiceID = {1, 4, 5}

var result = from table in _context.Table where table.ServiceID.Contains(ServiceID)

我正在寻找 Int 数组的类似过滤器。如果有人有任何想法,请提供帮助。

int[] ServiceID

不要调用局部变量 ServiceID -

  1. 局部变量应该以驼峰式命名,
  2. 代表集合的变量应该是复数,
  3. 您的 table 上有一个名为 ServiceID 的 属性 - 调用局部变量相同会导致混淆

您需要询问的模式不是“我的 table.ServiceId 是否包含这些需要的服务 ID”,而是“这些需要的服务 ID 是否包含 table 服务 ID”:


    int[] wantedServiceIDs = {1, 4, 5}

    var result = from table in _context.Table 
                 where wantedServiceIDs.Contains(table.ServiceID)

在 SQL 术语中,这将被翻译成

   FROM table
   WHERE serviceId IN (1,4,5)

你熟悉 SQL 的困惑在于,这是你要求的翻转..

您应该编写 list.Contains(column) 的 LINQ 并且 SQL 需要将其翻转到 column IN(list) - 当然,当您查看 english language 合乎逻辑 - x Contains yy IN x 的翻转。熟悉 SQL 的 IN,以及英文单词“IN”和“Contains”本身的意思几乎相同,可能会导致很多人尝试 column.Contains(list),而他们需要的是相反的

另一个可能的混淆点是,当人们考虑 SQL table 中的一列数据时,他们会看到多个值。但实际上 database/code 只考虑一个一次一行的数据,所以它是 multiple.Contains(single)single IN (multiple),永远不会是 multipleX.Contains(multipleY)


您还可以询问“是否有任何需要的服务 ID 等于 table 服务 ID”

var result = from table in _context.Table where 
  wantedServiceIDs.Any(wantedId => table.ServiceID == wantedId)

后一种形式比较棘手,因为它常常让你相信你可以使用复杂的表达式来完善你的 table,但你不能,所以我会努力避免使用它。例如

var wantedServices = new[] { new Service{ ID = 1, name = ""}, new Service{ ID = 2, name = ""} };

//this wouldn't work/not be translatable to SQL
var result = from table in _context.Table where 
  wantedServices.Any(wantedService => table.ServiceID == wantedService.ID)

使用简单的“ID 整数列表”.Contains 会阻止您尝试这种形式

你可以这样写(使用Contains)。还将您的数组变量名称更改为 ServiceIDs

int[] ServiceIDs = {1, 4, 5}  
var result = ServiceID.Where(i => ServiceIDs.Contains(i.OrderId));