2011-05-27 55 views
1

我正在使用EF CTP5 Code First与现有数据库进行开发。我需要通过比较不同类型的列从两个表中获取数据。将字符串列与Int列进行比较

例如 - 这里p.ColumnAvarchar作为q.ColumnAint但这些值可能对于少数记录是相同的。所以,我试图做Convert.ToInt32这是行不通的。我没有完全控制数据库来修改表。

from p in context.TableA 
from q in context.TableB 
where p.ColumnZ == "ABC" && 
    (p.ColumnA == null || Convert.ToInt32(p.ColumnA) == q.ColumnA) && 
    (p.ColumnB == null || p.ColumnB == q.ColumnB) 
select p.ColumnC 

有人可以提出解决方案吗?谢谢。

+0

需要更多信息。是Convert.ToInt32抛出和异常?你是否有其他错误?究竟发生了什么? – alexD 2011-05-27 21:24:17

+0

使用Convert.ToInt32时出现异常。例外:_“LINQ to Entities无法识别方法'Int32 ToInt32(System.String)'方法,并且此方法不能转换为存储表达式。”_ – MNIK 2011-05-27 21:26:27

回答

3

当您编写一个与entityframework进行交互的linq语句时,它会尝试将所有命令转换为SQL。由于没有Convert.ToInt32的sql命令,它会抛出一个错误。 This post描述了一种调用用于转换类型的sql函数的方法。它应该帮助你。

+0

感谢您的回复。我知道LINQ语句将被转换为SQL表达式,这就是为什么我的语句会失败。我知道SqlFunctions,但总是不愿意使用这些方法,因为我最终将目标应用于Sql Server和Oracle,那么这些SqlFunctions方法在与提供者一起使用时会被转换为Oracle吗? – MNIK 2011-05-27 22:28:16

+0

我不确定,但我的猜测是否定的。 'SqlFunctions'退出Sql Server的'System.Data.SqlClient'命名空间。你可能会幸运的。唯一的其他选择是将数据集加载到内存中,并在.Net端进行类型转换。 – Jay 2011-05-27 22:35:14

0

正如其他海报所解释的,实体并不知道​​如何将Convert.ToInt32转换为SQL表达式(LINQ to SQL可以明显地处理这个问题)。从我所知道的情况来看,它也不支持int.Parse。但由于您只是在进行平等比较(而不是大于/小于),因此您应该可以通过将int转换为string而不是将string转换为int来获得相同的结果。

from p in context.TableA 
from q in context.TableB 
where p.ColumnZ == "ABC" && 
    (p.ColumnA == null || p.ColumnA == q.ColumnA.ToString()) && 
    (p.ColumnB == null || p.ColumnB == q.ColumnB) 
select p.ColumnC 
相关问题