2017-01-04 4 views
0

こんにちは私は.Any()拡張メソッドを使って式ツリーに問題があります。Linq式ツリーAny()問題

ここに私のコードは次のとおり

IQueryable<Book> querableBooks = Books.Values.AsQueryable<Book>(); 

ParameterExpression pe = Expression.Parameter(typeof(Book), "book"); 

MemberExpression props = Expression.Property(pe, "properties"); 

ParameterExpression propList = Expression.Parameter(typeof(List<BookProperty>), "properties"); 

var _test = Expression.Lambda<Func<List<BookProperty>, bool>>(operation, new ParameterExpression[] { propList }); 

var _Any = Expression.Call(typeof(Enumerable), "any", new Type[] { typeof(BookProperty) }, new Expression[] { propList }); 

Expression Lamba = Expression.Lambda(_Any, _props); 

_test戻り{プロパティ=>((bookProperty.type.key == "ランジェリー")および(bookProperty.value == "1"))}

:{properties.Any()}

ラムダ戻り{book.properties => properties.Any()}

Bookクラスは次のようである

_Any戻ります

public class Book : IBook 
    { 

     public int id { get; set; } 
//Removed for clarity 
     public List<BookProperty> properties { get; set; } 

    } 

アンBookPropertyクラス:

public class BookProperty 
    { 
     public BookProperty() 
     { 
      value = "0"; 
     } 
     public int id { get; set; } 
     public int bookId { get; set; } 
     public Book book { get; set; } 
     public int typeId { get; set; } 
     public BookPropertyType type { get; set; } 
     public string value { get; set; } 
    } 

そしてBookPropertyTypeクラス:

public class BookPropertyType 
    { 
     public int id { get; set; } 
     public string groupe { get; set; } 
     public string key { get; set; } 
     public string label { get; set; } 
     public int order { get; set; } 
     public string editorType { get; set; } 
     public string unite { get; set; } 
    } 

だから私はそれに近いんだけど、私が持っているすべて正しくこれをマージするはありませんかこのようなクエリ

{book.propertie.Any(bookProperty.txt.key == "lingerie")と(bookProperty.value == "1")}

ご協力ありがとうございます。私が正しく理解していれば

+0

あなたは 'Book'とを含む場合には参考になります'BookProperty'クラスです。 –

+0

@IvanStoev私はクラスを追加しました。 – Julien

+0

あなたはプロパティの種類とプロパティの値に基づいてクエリ可能な書籍のサブセットを取得したいですか?もしそうなら:queryableBooks.Where(book => book.properties.Any(property => property.type.key == "lingerie" && property.value == "1")) – Brino

答えて

2

、あなたはこのような表現を探しています:

Expression<Func<Book, bool>> bookPredicate = book => book.properties.Any(
    bookProperty => bookProperty.type.key == "lingerie" && bookProperty.value == "1"); 

あなたはこのように動的に構築することができます。

var book = Expression.Parameter(typeof(Book), "book"); 
var properties = Expression.PropertyOrField(book, "properties"); 
var bookProperty = Expression.Parameter(typeof(BookProperty), "bookProperty"); 
// bookProperty.type.key == "lingerie" 
var conditionA = Expression.Equal(
    Expression.PropertyOrField(Expression.PropertyOrField(bookProperty, "type"), "key"), 
    Expression.Constant("lingerie") 
); 
// bookProperty.value == "1" 
var conditionB = Expression.Equal(
    Expression.PropertyOrField(bookProperty, "value"), 
    Expression.Constant("1") 
); 
// bookProperty.type.key == "lingerie" && bookProperty.value == "1" 
var condition = Expression.AndAlso(conditionA, conditionB); 
// bookProperty => bookProperty.type.key == "lingerie" && bookProperty.value == "1" 
var predicate = Expression.Lambda<Func<BookProperty, bool>>(condition, bookProperty); 
// book.properties.Any(bookProperty => bookProperty.type.key == "lingerie" && bookProperty.value == "1") 
var anyCall = Expression.Call(
    typeof(Enumerable), "Any", new[] { typeof(BookProperty) }, 
    properties, predicate 
); 
// book => book.properties.Any(...) 
var bookPredicate = Expression.Lambda<Func<Book, bool>>(anyCall, book); 
+0

ありがとうございました。 正常に動作します。私はすでにしているwherreコールにそれを置くことができました。それは完全に動作します。 私のコードを少しきれいにして最終結果を投稿します。 – Julien