2016-06-16 36 views
1

我正在为Linq-to-sql构建表达式树。在一些表格的数据库中,相关列存储为string,而其中一些存储为Guid。我已经通过用Expression.Convert(Expression.Constant(search.PolicyNumber), policyNumberColumnLambda.Type)(其中PolicyNumber有时是nullable)包装lambda常量来解决类似的问题,其中intint?工作得很好。但它不明显地转换为Guidstring转换。类型'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?为什么不把它作为一个quid并将其转换为linq-to-objects中的字符串? –

+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快,但是如果你有多种可能性,可能会导致长期if elseswitch声明

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); 

溶液2:

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)))

相关问题