Linq-to-sql
の式ツリーを構築しています。いくつかの表のデータベースでは、関連する列はstring
として格納され、一部はGuid
として格納されます。私はExpression.Convert(Expression.Constant(search.PolicyNumber), policyNumberColumnLambda.Type)
(PolicyNumber
が時々nullable
だった)でラムダ定数をラップすることによって、int
とint?
と同様の問題を解決しました。しかし、明らかにGuid
からstring
への飛行はありません。タイプ 'System.Guid'と 'System.String'の間に強制演算子が定義されていません
コードは次のようになります。私は式ツリーに一致する型を変換するにはどうすればよい
public static IQueryable<IRetrieveGuid> SearchByRetrieveGuid<IRetrieveGuid>(this IQueryable<IRetrieveGuid> queryable, SearchModel search)
{
var paramLambda = Expression.Parameter(typeof(IRetrieveGuid));
var columnLambda = Expression.Property(paramLambda, "retrieveguid");
var lambda = Expression.Lambda<Func<IRetrieveGuid, bool>>(
Expression.Equal(columnLambda, Expression.Convert(Expression.Constant(search.RetrieveGuid), columnLambda.Type)), paramLambda);
return queryable.Where(lambda);
}
を?
以下の非常に遅いので、データベース列は、GUIDのですか?なぜそれを単価として引っ張って、linqからオブジェクトへの文字列に変換しないのですか? –
@DStanleyいくつかのテーブルではGUID、一部では文字列です。私は大量の無秩序なデータベース(MSSQLとOracle)を照会するためのインタフェースを使ってアスペクト指向のものを書いています。私が置いているインタフェースは 'Interface {T Property}'なので、事前に型を知らないので)http://stackoverflow.com/questions/37812584/putting-interface-behind-properties-with-same-name-but-different-types) –