【问题标题】:Linq Convert.ToInt32 in Query查询中的 Linq Convert.ToInt32
【发布时间】:2015-06-22 12:00:43
【问题描述】:

我有一些代码:

(from AspNetUsers in db.AspNetUsers
join UserDetails in db.UserDetails on new { Id = Convert.ToInt32(AspNetUsers.UserDetailId) } equals new { Id = UserDetails.Id } into UserDetails_join
where
AspNetUsers.Email == "mickeymouse@blueyonder.co.uk"
select new
{
   AspNetUsersId = AspNetUsers.AspNetUsersId,
   UsertId = (int?)UserDetails.UserID
}).ToList();

(这是一个包含许多连接的更大查询的 sn-p)

无论如何,我遇到的问题是查询在 Linger 程序中完美运行,但是当我将查询复制到 VS 2013 时,由于 Convert.ToInt32 而失败。

不知道为什么?

【问题讨论】:

  • 异常说明了什么?
  • 您应该明确说明问题是什么“由于 Convert.ToInt32 而失败”并不能告诉我们太多。有编译器问题吗?运行时异常(如果有的话)?等

标签: c# sql linq entity-framework


【解决方案1】:

您不能在 linq to 实体中使用 Convert.ToInt32

一种方法是“在内存中”完成所有这些操作(枚举所有)。

但这当然对性能非常不利。

在你的情况下,另一种方式是

首先:在连接中以另一种方式执行(将 int 转换为 string:因为这种方式在 linq 到实体中是可行的)。

=> new { Id = AspNetUsers.UserDetailId } equals new { Id = SqlFunctions.StringConvert((double)UserDetails.Id) }

然后:仅获取您需要的数据,枚举并在 linq 中转换为对象。

select new
{
   AspNetUsersId = AspNetUsers.AspNetUsersId,
   UsertId = UserDetails.UserID
}).ToList()
.Select (m => new {
   m => m.AspNetUsersId,
   UsertId = (int?)m.UsertId
});

最后:最好的方法是不要将 int 存储为 varchar...

【讨论】:

    【解决方案2】:

    您可以使用强制转换(即(int?)AspNetUsers.UserDetailId)代替 Convert 并且 EF 提供者应该实现它(与提供者有关)。 SQL Server EF 提供程序可能会将其转换为 CAST AS

    【讨论】:

      猜你喜欢
      • 2012-02-06
      • 2013-05-15
      • 2020-08-21
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多