2014-01-10 4 views
1

사용 사례 : Mongo와 C# 백엔드와 통신해야하는 PHP 심포니 프로젝트. PHP 프론트 엔드에서는 Mongo로부터 데이터를 얻기 위해 질의를하는 것이 가능합니다. 이 쿼리는 API (XML)를 통해 전송됩니다. C# 백 엔드는이 XML을 deserialize하여 개체를 가져옵니다. 그런 다음 Linq-to-objects 쿼리 (API를 통해 전송되는 쿼리)를 내 메모리의 컬렉션에서 실행하려고합니다. 그래서 필자는 "LinqBuilder"를 만들어 객체를 질의하고 PHP 프론트 엔드에 반환 할 수있게하려고했습니다.배열 속성의 람다 식

public class MongoDoc 
{ 
    public int Id { get; set; } 
    public string Kind { get; set; } 
    public BsonDocument Data { get; set; } 
} 

아래는 내가 달성하기 위해 노력하고있어의 예입니다

나는 다음과 같은 목적을 가지고있다.

var list = source.Where(x => x.Data["Identifier"] == "H7PXXK").ToList(); // source is collection of MongoDoc objects 

위의 코드 줄은 동적이어야하기 때문에 표현식으로 작성하려고합니다.

ParameterExpression _expr = Expression.Parameter(typeof(MongoDoc), "x");  
expression = Expression.Equal(
    Expression.PropertyOrField(_expr, "Kind"), 
    Expression.Constant("KindValue") 
); 

이 다음 lamdba를 생성합니다 : 내가 달성 한 일은 다음과 같이 내 MongoDoc 개체의 "종류"속성을 쿼리하는 것입니다 정확하지만 지금은받을 필요가

x => (x.Kind == "KindValue") 

데이터 BsonDocument 속성의 속성 식별자. 일반적으로 위와 같을 것입니다 : x => x.Data["Identifier"] == "Value". 이것은 정확하게 내 문제입니다. 이것을 어떻게 할 수 있습니까?

답변

0

이렇게 생각해야합니다.

var _expr = Expression.Parameter(typeof(MongoDoc), "x"); 

//x.Data 
Expression member = Expression.PropertyOrField(_expr, "Data"); 

//x.Data["Identifier"] 
member = Expression.Property(member, "Item", new Expression[]{Expression.Constant("Identifier")}); 

//x.Data["Identifier"] == "H7PXXK" 
member = Expression.Equal(member, Expression.Constant((BsonValue)"H7PXXK")); 

편집 : 귀하의 코멘트에서

, 그것은

//x.Data["MoreData"] 
member = Expression.Property(member, "Item", new Expression[]{Expression.Constant("MoreData")}); 
//x.Data["MoreData"]["Identifier"] 
member = Expression.Property(member, "Item", new Expression[]{Expression.Constant("Identifier")}); 
+0

감사해야합니다! 그게 바로 제가 찾고 있던 것입니다. x.Data [ "Identifier"]가 BsonValue 유형이기 때문에 BsonValue에 캐스트를 추가해야했습니다. 그렇지 않으면이 예외가 발생합니다. "이진 연산자 Equal은 'MongoDB.Bson.BsonValue'및 'System.String'유형에 대해 정의되지 않았습니다." – DeluxZ

+0

다음은 Data 속성에 속성으로 다른 BsonDocument가 있으면 x.Data [ "MoreData"] [ "Identifier"] – DeluxZ

+0

@DeluxZ와 같은 것이 필요하므로 다음 번에는 @DeluxZ, edit (casts also missing)를 참조하십시오. –