2

次のSQLステートメントをLINQtoEntitiesクエリとして複製しようとしています(「PRODUCTS」はエンティティにマップされたテーブルです)...注IQueryable ...ソリューションとして投稿されたもののほとんどは、いずれかの検索パラメーターを変換します、または結果をIEnumerableにダンプしてから、そこから変換に進みます。私は数億のレコードを扱っており、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();

私はこれに似た他のいくつかのバージョンを試してみましたが、運がありませんでした。私は以下の投稿も運が悪かったので見ました。

Entity Framework linqクエリで文字列をintに変換し、解析例外を処理します。ソリューションは、エンティティプロパティを変換する前に、クエリをリストに変換します。

LINQ to Entitiesで文字列をIntに変換しますか?-この問題は、LINQからEntitiesステートメントの外部で簡単に実行できるパラメーターを変換することだけにありました。私はすでにパラメータに対してこれを行っています。

LINQ to Entities StringConvert(double)'を変換してintを文字列に変換することはできません-この問題は実際には私の逆であり、intを文字列に変換しようとしています。1)SqlFunctionsは、intに変換するための関数を提供していません。2)最終的な解決策は、値を変換/キャストする前に、再度IEnumerableに変換することです。

誰か他のアイデアがありますか?私はこれに少し困惑しています!

ありがとう、G

4

1 に答える 1

0

コードファーストを使用しないが、EDMXベースのアプローチモデルで定義された関数がおそらく最良の解決策である場合: EF4.0で文字列をIntに変換する

または、...を使用することもできます

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メソッドで拡張できますが、SQLクエリから返された結果セットを使用してメモリ内で実行されるのはオブジェクトへのLINQのみです。LINQを使用して、データベースで実行されるエンティティに拡張することはできません。したがって、にフィルタを追加しても、データベースクエリおよびDBからメモリにロードされるデータセットには影響しません。.WhereDbSqlQuery<T>

これは実際には驚くべきことではありません。そうでなければ、(Whereメソッドからの)部分式ツリーをSQLに変換してから、手書きのSQLステートメントにマージして、正しい新しい合成SQLステートメントが生成されてデータベース。私にはかなり難しい仕事のように聞こえます。

于 2013-03-20T22:34:37.897 に答える