簡體   English   中英

Linq表達式樹Any()問題

[英]Linq Expression tree Any() issue

您好,我在使用.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”))}}

_Any返回{properties.Any()}

Lambda返回{book.properties => properties.Any()}

Book類是這樣的:

 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 => bookProperty.type.key ==“內衣”)和(bookProperty.value ==“ 1”)}

謝謝你的幫助。

如果我理解正確,那么您正在尋找這樣的表達方式:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM