gpt4 book ai didi

Linq IQueryable.Any() 用法

转载 作者:行者123 更新时间:2023-12-02 06:47:25 28 4
gpt4 key购买 nike

下面是我的代码。请查看。

 1. bool isUnavailable = db.Deploys.Where(p => 
p.HostEnvironmentId == Guid.Parse(host.ID) &&
p.Status == (int)DeployStatus.Deploying).AsEnumerable().Any();

这个有效。

以下语句不起作用。

2. bool isUnavailable = db.Deploys.Where(p => 
p.HostEnvironmentId == Guid.Parse(host.ID) &&
p.Status == (int)DeployStatus.Deploying).Any();//Error

异常(exception)是

    An exception of type 'System.NotSupportedException' occurred in 
Microsoft.Data.Services.Client.DLL but was not handled in user code

Additional information: The method 'Any' is not supported.


3. bool isUnavailable = db.Deploys.Where(p =>
p.HostEnvironmentId.ToString() == host.ID &&
p.Status == (int)DeployStatus.Deploying).AsEnumerable().Any();//Error

异常(exception)是

    An exception of type 'System.NotSupportedException' occurred in 
Microsoft.Data.Services.Client.DLL but was not handled in user code
Additional information: The expression (([10007].HostEnvironmentId.ToString() ==
"b7db845b-cec4-49af-8f4b-b419a4e44331") And ([10007].Status == 90)) is not supported.

Deploys 类是构建在 WCF 数据服务的客户端代理类中的模型。我使用“添加服务引用”来创建 WCF 客户端代理类。

但是对于通用列表,假设下面的代码。它会工作得很好。

4.bool b=servers.Where(d => 
d.status == (int)Enums.ServerStatus.Deploying ||
d.status == int)Enums.ServerStatus.Unavailable).Any();

我的问题是

Why same way used in different Class got different result .(See the method 2 and method 4).

Why 2 and 3 don't work.

希望有人能帮助我。谢谢

最佳答案

LINQ 有一个“提供者”的概念。当在不同的数据源上使用 LINQ 时,根据数据源的不同,相同的 LINQ 查询需要发生不同的事情。

例如,当您想使用LINQ查询数据库时,需要将LINQ查询转换为SQL查询。当数据源为OData时,查询需要转换为URL。每个提供程序都有不同的提供程序,并且每个提供程序都支持 LINQ 运算符和其他语言构造的不同子集。 LINQ-to-SQL、Entity Framework 和 LINQ-to-NHibernate 是用于数据库访问的三种流行的 LINQ 提供程序。

就您而言,您使用的是 WCF 数据服务,其中包括 OData 的 LINQ 提供程序。由于在 OData 中无法表达 .Any() LINQ 运算符,尝试在与该提供程序的查询中使用它会引发异常。通过使用.AsEnumerable()您实质上是说此时停止使用 OData LINQ 提供程序并开始使用 LINQ-to-Objects 提供程序(从技术上讲,它不是提供程序,但从概念上讲,您可以将其视为提供程序)。这仅意味着 .AsEnumerable() 之前的内容将转换为 OData 查询,从而检索所有 Deploy.Where() 匹配的实体,全部传输给客户端后,客户端会执行.Any()通过检查 Deploy 的数量它收到的实体。如果有很多这样的实体,这当然是不好的,当您想要的只是服务器端(可能是数据库)检查是否有任何实体时,它会导致通过网络进行不必要的数据传输。不幸的是,.Any() OData 1.0 不支持(我不知道 OData 2.0)。

此外,OData 可能不支持 .ToString()任何一个。您可能需要比较 Guid直接构造,即创建一个包含要比较的 GUID 值的局部变量:

var g = Guid.Parse("b7db845b-cec4-49af-8f4b-b419a4e44331")`

然后在查询中比较 GUID,如下所示:

x.HostedEnvironment == g

关于Linq IQueryable.Any() 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12128255/

28 4 0