gpt4 book ai didi

c# - "where"条款 : entity id is in a potentially null array

转载 作者:行者123 更新时间:2023-11-30 14:33:23 26 4
gpt4 key购买 nike

我有一个办公室 ID 数组,该数组可能为空。如果 officeIdsToSelect 数组为空,我希望 EF 查询返回所有 记录,或者如果不为空,则仅返回匹配的记录。然而这:

int[] officeIdsToSelect = new int[] { 1, 2, 3 };
Office[] selectedOffices = (from item in new TdsDb().Offices
where (officeIdsToSelect == null || officeIdsToSelect.Contains(item.OfficeID))
select item).ToArray();

抛出异常:

System.NotSupportedException : Cannot compare elements of type 'System.Int32[]'. Only primitive types (such as Int32, String, and Guid) and entity types are supported.

具体来说,Linq to Entities 反对 officeIdsToSelect == null。我明白它在说什么(更清晰的 EF 错误消息之一...)

那么我怎样才能在这里得到我想要的东西呢?

最佳答案

EF 无法翻译 officeIdsToSelect == null到 SQL。

另一方面,EF 足够聪明来翻译 officeIdsToSelect.Contains(item.OfficeID)WHERE OfficeID IN (1, 2, 3) .

所以基本上,你可以简单地做:

Office[] selectedOffices;
if (officeIdsToSelect == null)
{
selectedOffices = new TdsDb().Offices.ToArray();
}
else
{
selectedOffices = (from item in new TdsDb().Offices
where officeIdsToSelect.Contains(item.OfficeID)
select item).ToArray();
}

编辑:

如果您的实际查询更复杂并且您不想重复它,您可以做的是有条件地添加一个 Where条款取决于您的 int 的值(value)数组。

// Here's a query that is NOT YET executed (deferred execution)
var query = (from item in new TdsDb().Offices
...... your whole complicated request here
select item);

// Conditionnally adds a where clause if required
if (officeIdsToSelect != null)
{
// Still not yet executing the query. We're just building the query for now
query = query.Where(z => officeIdsToSelect.Contains(z.OfficeID));
}

// OK, now executes the query and get the results
Office[] selectedOffices = query.ToArray();

if the conditional Where doesn't overwrite the original Where clause; but is addative

是的,这就是 LINQ to Entities 的强大之处:流畅的编程延迟执行

流畅的编程意味着您可以链接 方法,这要归功于 IQueryable 的 LINQ 是可能的扩展方法。

例如, IQueryable<T>.Where(...) 还返回 IQueryable<T>目的。它在内部向查询添加一个谓词,然后返回您指定为参数的查询。

另一个重要的部分是延迟执行。这允许在实际请求数据之前执行查询。只有当您真正需要数据时,请求才会针对您的数据库实际执行。在上面的示例中,它是 .ToArray()实际执行查询的命令。

参见 this nice MSDN article有关查询执行机制的详细信息。

关于c# - "where"条款 : entity id is in a potentially null array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16593257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com