私は約150のテーブルを持ち、特定の列を持つテーブルを照会できる検索メカニズムで動作する約50のデータベースを持っています。ほとんどのデータベース構造は似ていますので、EFエンティティを生成し、生成されるテーブルに特定の列がある場合は生成されたエンティティの背後にインターフェイスを配置して、後でその列を照会することができます。他人にそれはDecimal
(オラクル)だと、時にはそれがNullable
だと、時々、それはありませんが、私は私がマップしようとしているいくつかのテーブルの列に予期しない問題に遭遇した同じ名前で異なるタイプのプロパティの後ろにインターフェイスを置く
After doing thisはLong
です。
私が見ることができる1つの解決策は、プロパティを持たずにインターフェイスを追加し、実行時にクエリの実行前にその列の特定の型を決定することです。
プロパティに複数の型がある可能性があるため、コンパイラが実装されていないと不平を言わないように、インターフェイスに型を追加する方法はありますか?オブジェクトが動作しない場合は、質問が多少複雑であるためコード例が必要な場合はお知らせください。私は、エンティティで使用する予定の
メカニズム:
public static class ExpressionExtensions
{
public static IQueryable<T> ApplySearch<T>(this IQueryable<T> queryable, SearchModel search) where T : class
{
if (search != null && search.PolicyNumber.HasValue && typeof(IPolicyNumber).IsAssignableFrom(queryable.ElementType))
{
queryable = queryable.SearchByPolicyNumber(search);
}
return queryable;
}
public static IQueryable<IPolicyNumber> SearchByPolicyNumber<IPolicyNumber>(this IQueryable<IPolicyNumber> queryable, SearchModel search)
{
var policyNumberParameterLambda = Expression.Parameter((typeof(IPolicyNumber)));
var policyNumberColumnLambda = Expression.Property(policyNumberParameterLambda, "POLICY_NO");
var lambda = Expression.Lambda<Func<IPolicyNumber, bool>>(
Expression.Equal(policyNumberColumnLambda,
Expression.Convert(Expression.Constant(search.PolicyNumber), policyNumberColumnLambda.Type)
), policyNumberParameterLambda);
return queryable.Where(lambda);
}
}
ジェネリックスFTW ... – spender
@spenderジェネリックスFTW同志... :) –