gpt4 book ai didi

c# - 为什么一个查询有效而另一个查询无效?

转载 作者:太空狗 更新时间:2023-10-29 20:13:17 25 4
gpt4 key购买 nike

我正在使用辅助方法根据用户访问权限预过滤我的所有查询。

假设方法签名为:

public IQueryable<Client> GetAllClients()

为什么这在使用 LINQ 时有效:

IQueryable<Client> allItems = GetAllClients();
return (from item in allItems
where item.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase)
select item).FirstOrDefault();

但不是这个:

return (from item in GetAllClients() 
where item.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase)
select item).FirstOrDefault();

我做第一个没问题,但是离开 LINQ 几年了,如果能理解这个的原因就好了。

不工作我的意思是选项 2 给出了这个异常(exception):

A first chance exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll

Additional information: LINQ to Entities does not recognize the method 'System.Linq.IQueryable`1[typename] GetAllClients()' method, and this method cannot be translated into a store expression.

Clients 是一种存储在数据库中的数据类型。我在 Entity Framework 数据模型上为常用查询创建方法,由于 Multi-Tenancy 设计具有按数据类型定义的安全访问权限,我想在数据访问级别进行过滤。

最佳答案

这里的问题是可查询层试图将方法调用 GetAllClients 转换为查询,而不是使用 GetAllClients 的返回值作为查询的来源询问。是的,在句法上具有欺骗性,但也完全在意料之中。

发生这种情况是因为 IQueryable 对象与 IEnumerable 不同,它实际上提供了可用于将(在本例中)转换为 SQL 的元代码。由于大多数 C# 方法没有 SQL 等效项,并且无法以相同的方式扫描已编译方法的元代码,因此此类框架在遇到无法翻译的内容时只会出错。

请注意,避免大部分此类问题的一种方法是避免使用 Linq 语法,而是进行方法调用,这会稍微减少一些欺骗性:

return GetAllClients()
.Where(item => item.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase)
.FirstOrDefault();

关于c# - 为什么一个查询有效而另一个查询无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29655205/

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