我正在尝试将以下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。
有人有任何其他想法吗?我对这一点感到难过!
谢谢你, ģ
答案 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声明结果并可以发送到数据库。听起来对我来说是一项非常艰巨的任务。