2

我正在尝试将以下 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();

我已经尝试了与此类似的其他几个版本,但没有运气。我也没有运气看过以下帖子。

在实体框架 linq 查询中将字符串转换为 int 并处理解析异常- 该解决方案在转换实体属性之前将查询转换为列表。

在 LINQ to Entities 中将字符串转换为 Int ?- 这个问题只是转换了可以在 LINQ to Entities 语句之外轻松完成的参数。我已经为参数这样做了。

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

有人有其他想法吗?我对这个有点难过!

谢谢你,G

4

1 回答 1

0

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

或者,您可以使用...

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

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

DbSet<T>.SqlQuery(...)返回 aDbSqlQuery<T>作为结果。重要的是要记住,这种类型不实现IQueryable<T>而只是IEnumerable<T>. 它的签名是:

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

因此,您可以使用其他 LINQ 方法扩展此结果,但只有 LINQ to Objects 将在内存中执行,并使用 SQL 查询返回的结果集。您不能使用LINQ将其扩展为将在数据库中执行的实体。因此,添加.Where过滤器对DbSqlQuery<T>数据库查询和从数据库加载到内存的数据集没有任何影响。

这实际上并不奇怪,因为否则这意味着必须将部分表达式树(来自Where方法)翻译成 SQL,然后合并到手写 SQL 语句中,以便生成正确的新组合 SQL 语句并可以发送到数据库。听起来对我来说是一项相当艰巨的任务。

于 2013-03-20T22:34:37.897 回答