0

매우 기본적인 식 트리 생성기로 작업하여 SQL 식을 만듭니다.Guid 속성과 String 값을 비교 한 다음 TSQL로 변환하는 식

var propertyInfo = typeOf(User).GetProperties().First(p=>p.Name=="Name"); 

Expression.Call(
    Expression.Property(Expression.Parameter(typeof(User), "val"), propertyInfo), 
    typeof(string).GetMethod("Contains"), 
    Expression.Constant("john") 
) 

:

예를 들어, String 값 "존"대 "이름"이라는 String 속성을 비교 가상 클래스 User에 대한 식을 만드는 데,이 같은 코드의 조각을 사용하여 어떤 생성과 비슷한 (코드와 EF 개입의 일부 라인 후) :

[...] Name LIKE '%john%' [...] 

내 문제가 Guid 속성입니다 ...

,

나는 비슷한 아주 간단한 SQL 쿼리를 생성하기 위해, String 값 N 대 Guid 특성을 비교하기 위해 표현식을 구성하는 방법을 figurate 수 없습니다 내가 GuidString 사이 Equals 방법을 사용할 수 없습니다

[...] Id='38EB4D06-E50B-4C7A-80FF-A6350051682A' [...] 

. ... 임 정말 우둔, 어떤 제안이 잘

+0

Guid를 문자열로 변환하기 위해 ToString()을 시도 할 수 있습니다 –

+0

[SqlFunctions.StringConvert] (http://msdn.microsoft.com/en-us/library/dd466166.aspx)로 시도한 이유는' ToString()'[엔티티 질의를위한 LinQ에서는 구현되지 않았다.] (http://stackoverflow.com/questions/26146272/cant-use-tostring-in-linq-to-entities-query). ... –

답변

2

이 작동합니다 ... 접수됩니다

var propertyInfo = typeof(Entity).GetProperties().First(p => p.Name == "Id");  

    var paramExpr = Expression.Parameter(typeof(Entity)); 
    var propertyAccessExpr = Expression.MakeMemberAccess(paramExpr, propertyInfo); 
    var guidExpr = Expression.Constant(Guid.Parse("38EB4D06-E50B-4C7A-80FF-A6350051682A")); 
    var body = Expression.Equal(propertyAccessExpr, guidExpr); 
    var lambda = Expression.Lambda<Func<Entity, bool>>(body, paramExpr); 

    Console.WriteLine(lambda); // Param_0 => (Param_0.Id == 38eb4d06-e50b-4c7a-80ff-a6350051682a) 
,

Entity은 다음과 같습니다

public class Entity 
{ 
    public Guid Id { get; set; } 
} 

Fiddle.

+0

기본적으로 'Expression.Constant (Guid.Parse ("38EB4D06-E50B-4C7A-80FF-A6350051682A"))는 _magic_ 부분 ... Thx입니다. –

+0

@ SebastiánGuerrero : 천만에요. – Dennis

관련 문제