2016-12-20 8 views
1

データベースの文字列をアプリケーションの整数にマップしようとするときに問題があります。コードの最初のストアのプロパティのプロパティ

私は車両のコレクションを持つデータベースを持っています。テーブルが作成されると、年の列がvarcharとして指定されました。私はそれを使って計算を実行するために値を整数として必要とします。

私はそれを変換するためにint.Parseを使うことができますが、私はそれをエンティティフレームワーククエリで動作させる必要があると知っています。 int.Parseはエンティティに対するlinqではサポートされていないため、このメソッドは無効です。

私が試した次のことは、ビューを作成し、その列をint型にキャストすることでした。これは完全に機能し、データベースに書き込む必要があるまで、ビューには派生フィールドが含まれているため、エラーがスローされます。

私が次に試みたのは、Pawel Kadluczkaの "EntityFramework.CodeFirstStoreFunctions"ライブラリでした。これは機能しますが、唯一の私はこのようにそれを直接指定する場合:

のparseIntが

[CodeFirstDbFunction("ParseInt")] 
public static int ParseInt(string number) { 
    throw new NotSupportedException("Direct calls are not supported."); 
} 

SQLでのparseInt関数は単に@ P1が渡されるcast(@p1 as int)呼び出すとC#で定義されて

Store.Vehicles.Where(x => CustomSqlFunctions.ParseInt(x.ModelYear) == 2000) 

文字列。

私の質問は
CustomSqlFunctions.ParseInt(ModelYear)をVehicleクラスのプロパティから呼び出すことはできますか?

public int? Year { 
    get { return CustomSqlFunctions.ParseInt(ModelYear); } 
    set { ModelYear = value.ToString(); } 
} 

が、私は年がエンティティ

答えて

0

私は結局それを理解しました。それはむしろ単純な解決策でした。私は計算された列でカスタムビューに戻りました。今度は、私は 'ModelYear'と呼ばれる元のフィールドを保持し、文字列からintへのキャストになる 'Year'列を追加しました。

年プロパティは、最終的にはこのように見えた:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public int? Year { 
    get { return _year; } 
    set { 
     _year = value; 
     ModelYear = value.ToString(); 
    } 
} 

値は年に設定されている場合、それはまた、文字列としてModelYearに設定されています。モデルがデータベースに保存されると、ModelYearフィールドが更新され、Yearフィールドが計算済みとしてマークされているため、フレームワークはフィールドも保存しようとしません。

補足説明年は実際に始まった年ではありませんでした。 Entityフレームワークのソースコードをステップ実行した後、式が評価される前に、呼び出されたプロパティが実際にデータベースのマップされたメンバーであるかどうかを調べることが最初に確認されました。 Yearがマップされていないため、Yearを含む式は評価されていませんでした。

0

私はYearがデータベースにマップされていないことを前提とするLINQでサポートされていないエラーが表示されます。

私はこれを試してみました。その場合、あなたはそれと同等の「キャスト」を行います:

get 
{ 
    int value; 
    return int.TryParse(ModelYear, out value) ? value : null; 
} 
+0

残念ながら、int.Parse(およびint.TryParse)は、Linq to Entitiesで使用されるSQL関数に変換できないため、これは私の状況では機能しません。 –

関連する問題