2015-06-22 2 views
-1

У меня есть некоторый код:Linq Convert.ToInt32 в Query

(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 == "[email protected]" 
select new 
{ 
    AspNetUsersId = AspNetUsers.AspNetUsersId, 
    UsertId = (int?)UserDetails.UserID 
}).ToList(); 

(Это фрагмент из большого запроса, который содержит многие соединения)

Во всяком случае, проблема у меня есть, что запрос выполняется отлично в программе Linger, но когда я копирую запрос на VS 2013, он терпит неудачу из-за Convert.ToInt32.

Не можете понять, почему?

+0

Что такое исключение? – leppie

+2

Вы должны четко указать, в чем проблема: «Это не удается из-за Convert.ToInt32», не говорит нам многого. Есть ли проблема с компилятором? Исключение во время выполнения (если это так)? и т.п. – Chris

ответ

1

Вы не можете использовать Convert.ToInt32 в linq для объектов.

Одним из способов было бы сделать все это «в памяти» (перечислить все).

Но, конечно, это очень плохо для производительности.

Еще один способ, в вашем случае, будет

Первого: делать это по-другому в соединении (конвертировать 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 
}); 

Наконец: лучший способ будет не хранить ИНТАС VARCHAR ...

0

Вы можете использовать бросок (т.е. (целое) AspNetUsers.UserDetailId?) Вместо того, чтобы преобразовать и EF провайдеры должны реализовать его (относится к провайдеру). Поставщик SQL Server EF, вероятно, преобразует его в CAST AS