2016-06-16 3 views
1

Linq-to-sqlの式ツリーを構築しています。いくつかの表のデータベースでは、関連する列はstringとして格納され、一部はGuidとして格納されます。私はExpression.Convert(Expression.Constant(search.PolicyNumber), policyNumberColumnLambda.Type)PolicyNumberが時々nullableだった)でラムダ定数をラップすることによって、intint?と同様の問題を解決しました。しかし、明らかに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); 
    } 

を?

+0

以下の非常に遅いので、データベース列は、GUIDのですか?なぜそれを単価として引っ張って、linqからオブジェクトへの文字列に変換しないのですか? –

+0

@DStanleyいくつかのテーブルではGUID、一部では文字列です。私は大量の無秩序なデータベース(MSSQLとOracle)を照会するためのインタフェースを使ってアスペクト指向のものを書いています。私が置いているインタフェースは 'Interface {T Property}'なので、事前に型を知らないので)http://stackoverflow.com/questions/37812584/putting-interface-behind-properties-with-same-name-but-different-types) –

答えて

1

解決法1:

これは速く対処方法2よりも大きさである、しかし、あなたはさまざまな可能性を持っている場合、対処方法2

var retrieveGuidAsString = search.RetrieveGuid.ToString(); var constantLambda = columnLambda.Type.Name == "Guid" ? Expression.Constant(search.RetrieveGuid) : Expression.Constant(retrieveGuidAsString); var lambda = Expression.Lambda<Func<IRetrieveGuid, bool>>(Expression.Equal(columnLambda, constantLambda), paramLambda); 

長いif elseswitch声明の中で可能性があります

This did work

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.Call(Expression.Convert(Expression.Constant(search.RetrieveGuid), typeof (object)), typeof (object).GetMethod("ToString"))), paramLambda); 
     return queryable.Where(lambda); 
    } 

が、それが生成するように、SQL

([Extent1].[retrieveguid] = 'c87d1234-46ad-47bf-9a9c-d9a35a454bd5' as uniqueidentifier) AS nvarchar(max))))) OR (([Extent1].[retrieveguid] IS NULL) AND (LOWER(CAST(cast('c87d1234-46ad-47bf-9a9c-d9a35a454bd5' as uniqueidentifier) AS nvarchar(max))) IS NULL)))

関連する問題