查询中的Linq Convert.ToInt32

时间:2015-06-22 12:00:43

标签: c# sql linq entity-framework

我有一些代码:

(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();

(这是包含许多联接的大得多的查询的片段)

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

无法弄清楚原因?

2 个答案:

答案 0 :(得分:3)

您不能在linq中使用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 ...

答案 1 :(得分:0)

您可以使用强制转换(即(int?)AspNetUsers.UserDetailId)而不是转换,EF提供商应该实现它(与提供者相关)。 SQL Server EF提供程序可能会将其转换为CAST AS