3

int に変換された文字列でリストを並べ替えたいと思います。

var orderedListOfRfidTags = uow.RfidTags.OrderBy(t => Convert.ToInt32(t.Number)).ToList();

ただし、取得: メソッド「ToInt32」はサポートされていません。

4

6 に答える 6

6

どうですか:

var orderedListOfRfidTags = uow.RfidTags.OrderBy(t => t.Number).ToList();

CLR メソッドを削除して、ORM が既知の SQL クエリに変換できるようにします。

編集:最初に変換したいので、読んだだけです:

var orderedListOfRfidTags = uow.RfidTags.ToList().OrderBy(t => Convert.ToInt32(t.Number));

前に述べたように、DB からすべてを取得してからクライアント (linq to object) で注文するか、ORM でメソッドを見つけて int にキャストします。注文する前に Number が変換された新しいリストを選択し、それで注文します。

編集2:

このORMで動作するダイレクトキャストはどうですか?

var orderedListOfRfidTags = uow.RfidTags.OrderBy(t => (int)t.Number).ToList();
于 2011-05-12T22:03:42.590 に答える
3

私はLightSpeedの開発者の1人です。

LightSpeed 3.11 RTMのLINQプロバイダーは、Convert.ToInt32をサポートしていません。ただし、今すぐダウンロードできるナイトリーリリースを介してサポートを追加しました。

夜間リリースを使用したくない場合は、Query Objects APIにドロップダウンし、SQL CAST関数を直接呼び出すことで、目的の結果を得ることができます。これは次のようになります。

Query query = new Query
{
  Order = Order.By(Entity.Attribute("Number")
                         .Function("CAST", new LiteralExpression("INTEGER") { EmitInline = true }))
};

uow.Find<RfidTag>(query);

キャストタイプのかなり冗長なLiteralExpressionの理由は、デフォルトでLightSpeedがパラメーターを介してデータベースに値を送信するためです(SQLインジェクション攻撃を回避するため)。ただし、CAST関数の場合、SQLエンジンは、p0の値が「INTEGER」である場所ではCAST(Number, INTEGER)なく、確認する必要があります。CAST(Number, @p0)したがって、より自然な文字列リテラルではなく、パラメータ化をバイパスするEmitInline式を使用する必要があります。

ただし、繰り返しになりますが、ナイトリーリリースはLINQのConvert.ToInt32をサポートしているため、ナイトリービルドを避けたい場合にのみ、このレベルにドロップダウンする必要があります。

于 2011-05-19T21:20:37.743 に答える
1
var orderedListOfRfidTags = (uow.RfidTags.ToList()).OrderBy(t => int.Parse(t.Number));
于 2012-05-18T14:19:31.253 に答える
0

したがって、この問題に対する私の解決策は次のとおりです。

var query = (from q in query select q).ToList().Where(x => Convert.ToInt32(x.col_string) > 0);

最初に IQueryable をリストにキャストし、次にデータ型 string の列を int32 に変換して、数学演算で使用できるようにしました。

これが役立つことを願っています。

于 2013-02-15T22:52:41.007 に答える
0

「RfidTags」がどのようなタイプであるかはわかりませんし、Lightspeed ORM にも精通していませんが、Linq to Sql で同様の問題が発生したときに、特定のメソッドを呼び出そうとしていることを知っています。 Where または OrderBy 句がサポートされていない場合は、単純な古い Linq を扱うように変更します。

たとえば、これを試してみませんか?

var listOfRfidTags = uow.RfidTags.ToList();
var orderedListOfRfidTags = listOfRfidTags.OrderBy(t => Convert.ToInt32(t.Number));

(はい、これを 1 行に結合することは可能ですが、ここではわかりやすくするために 2 行で示しています。)

幸運を!

于 2011-05-12T22:11:18.070 に答える
0

int.ParseConvert の代わりに使用してみてください。Lightspeed は、一方をサポートせずに他方をサポートしている可能性があります。

var orderedListOfRfidTags = uow.RfidTags
    .OrderBy(t => int.Parse(t.Number))
    .ToList();
于 2011-05-12T22:29:03.707 に答える