在LINQ to Entities中将String转换为Int

时间:2013-03-12 23:00:54

标签: entity-framework linq-to-entities entity-framework-5

我正在尝试将以下SQL语句复制为LINQ to Entities查询(其中“PRODUCTS”是映射到实体的表)...注意IQueryable ...我看到的大部分内容都是作为解决方案转换的搜索 参数 ,或将结果转储到IEnumerable中,然后从那里继续转换。我正在处理数以百万计的100万条记录,无法负担将2亿条记录加载到内存中,只需要再次过滤掉它们。我想,如果可能的话,在对数据库的单个查询中这样做。

select *
from PRODUCTS
where
    MODEL_CODE = '65' and
    CAST(SERIAL_NUMBER as int) > 927000 and
    CAST(SERIAL_NUMBER as int) < 928000

我试过以下......

int startSN, endSN;
startSN = 9500
endSN = 9500

if (!int.TryParse(startSerialNumber, out startSN))
    throw new InvalidCastException("The start serial number was not a valid value");

if (!int.TryParse(endSerialNumber, out endSN))
    throw new InvalidCastException("The end serial number was not a valid value");

    IQueryable<PRODUCT> resultList = base.Context.PRODUCTS.Where(b => 
        (Convert.ToInt32(b.SERIAL_NUMBER) > startSN) &&
        (Convert.ToInt32(b.SERIAL_NUMBER) < endSN)).AsQueryable();

我尝试了几个类似的东西,但没有运气。我也看了下面的帖子也没有运气。

Convert string to int in an Entity Framework linq query and handling the parsing exception - 解决方案在转换实体属性之前将查询转换为列表。

Convert string to Int in LINQ to Entities ? - 这个问题只是转换参数,这些参数可以在LINQ to Entities语句之外轻松完成。我已经为参数做了这个。

LINQ to Entities StringConvert(double)' cannot be translated to convert int to string - 这个问题实际上与我的相反,试图将int转换为字符串。 1)SqlFunctions不提供转换为int的函数。 2)最终解决方案是在转换/转换值之前再次转换为IEnumerable。

有人有任何其他想法吗?我对这一点感到难过!

谢谢你, ģ

1 个答案:

答案 0 :(得分:0)

如果您不使用代码优先,但基于EDMX的方法模型定义的函数可能是最佳解决方案:Convert String to Int in EF 4.0

或者你可以使用......

base.Context.PRODUCTS.SqlQuery(string sql, params object[] parameters)

...然后传入你问题中的原始SQL语句。

DbSet<T>.SqlQuery(...)返回DbSqlQuery<T>作为结果。请务必注意,此类型实施IQueryable<T>,但仅IEnumerable<T>。它的签名是:

public class DbSqlQuery<TEntity> : IEnumerable<TEntity>, IEnumerable, IListSource
    where TEntity : class

所以你可以使用更多的LINQ方法扩展这个结果,但是只有LINQ to Objects将在内存中执行,并返回SQL查询的结果集。您可以使用将在数据库中执行的 LINQ to Entities 扩展它。因此,向.Where添加DbSqlQuery<T>过滤器对数据库查询以及从DB加载到内存中的数据集没有任何影响。

这实际上并不令人惊讶,因为它意味着部分表达式树(来自Where方法)必须被翻译成SQL然后合并到手写的SQL语句中,以便正确的新组合SQL声明结果并可以发送到数据库。听起来对我来说是一项非常艰巨的任务。