2017-12-07 3 views
0

これはそれより簡単ですね!私は文字列値として格納されている量を含むテーブルがあります。しかし、私のコードでは小数点以下の値を必要とし、IQueryableが作成しているクエリの一部として小数にキャストする必要があります。したがって、.ToList()の使用は不可能です。キャストはその背後のデータベースによって行われる必要があります。
このIQueryableは、基本的にIQueryablesのチェーンの一部です。そのため、次のクエリでは、この量のフィルタを追加して、より小さい選択を行うか、量の他の種類の計算を行うことができます。入力されるクエリは、すでにすべてのデータの副選択である可能性があります。
編集:私はここで働いているかを説明してみましょう:私は書くために、このメソッドのようなものがあります:IQueryable内で文字列を10進数に変換する方法

public static IQueryable<PriceList> GetPriceList(this IQueryable<PriceData> query) => query.Select(d => new PriceList{Name = d.Item.Name, Price = decimal.Parse(d.Value)}).AsQueryable(); 

をそしてPriceDataは、文字列値としていくつかのフィールドと価格を含むレコードです。しかし、PriceListレコードにはDecimalとしてそれらが必要です。
この方法は、その後の選択、数学などのために、別の拡張方法で使用できます。 decimal.parseやその他のオプションはIQueryable内では機能しません。

+1

どのように '( "someTable FROM CONVERT(量、DECIMALを選択)")dbContext.someTable.SqlQuery AsIQueryable()'について。? –

+0

もし私がそれを行うことができれば、ええ。しかし、いいえ。私は入力としてIQueryableを取得し、大きな式ツリーのすべての部分であるので、出力としてIQueryableを取り除かなければなりません。 –

+1

なぜ最初のインスタンスの価格は文字列ですか?これは間違っているようです。 (そしておそらくMoney、Decimalでなければなりません)。つまり、おそらく* https://stackoverflow.com/questions/12118258/int-parse-in-linq-expression –

答えて

1

既にコメントされているように、何をしようとしているのかはサポートされていません。

  • あなたの最善の策は、それがactualy何を表すかにデータベースのフィールドタイプを変更することです:それが不可能な場合は、/マネー
  • 進ことを可能にする能力を持っていた人に話を

それが不可能な場合、私は想像することができる最も近い回避策は次のとおりです。

public class PriceList 
{ 
    public string Price { get; set; } 
    public decimal ParsedPrice => decimal.Parse(Price); 
} 

そして:

.Select(d=>new PriceList 
{ 
    Price = d.Price 
}); 

ただし、ParsedPriceでDbOperationsを実行することはできません。また、EF6でパラメータを持つコンストラクタを使用することはできません。それはあなたが遭遇する次の問題です。

EFはCRUDに最適です。さらに多くの場合、おそらく必要なデータだけを取得し、それらを具体化し、DTOまたはビジネスオブジェクトを作成するサービスを持つべきです。そのような

何か:

public class MyService 
{ 
    public IEnumerable<PriceList> GetPriceList(Expression<Func<MyEntity, bool>> predicate) 
    { 
     var data = _context.MyEntity.Where(predicate).ToList(); 
     foreach (var item in data) 
     { 
      var dto = new PriceList {...} 
      yield return dto; 
     }   
    } 
} 
+0

ええ、それは迷惑です。だから、他の方向に変換するにはなぜ類似したものはありませんか?私はhttps://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/language-reference/clr-method-to-canonical-function-mappingが見つかりませんでした。文字列番号は表示されませんコンバージョンは不可能だと思われます。今の... –

+1

はおそらくので、すべてのint型は文字列を指定できますが、すべての文字列をint型することができません。しかし、私は何の仮定もしたくない、私は100%確信していない。変換が失敗した場合はTrue –

+0

、しかし、あなたは結果としてNANを返すことができます。例外として、多くのデータベースがエラーを簡単に返すようになります。しかしDBFunctionsとSqlFunctionsの両方が、彼らのSQLの対応にC#の機能をマップすることが可能であることを示唆しているようです。次に、文字列を数値に変換する必要性が設計上の欠陥とみなされる傾向があります。私は現在のシステムで修正できません。 –

関連する問題