คำถามติดแท็ก expression-trees


21
การดึงชื่อคุณสมบัติจากแลมบ์ดานิพจน์
มีวิธีที่ดีกว่าที่จะได้รับชื่อทรัพย์สินเมื่อส่งผ่านผ่านการแสดงออกแลมบ์ดา? นี่คือสิ่งที่ฉันมีอยู่ในปัจจุบัน เช่น. GetSortingInfo<User>(u => u.UserId); มันทำงานโดยการหล่อมันเป็น memberexpression เฉพาะเมื่อคุณสมบัติเป็นสตริง เพราะคุณสมบัติไม่ทั้งหมดเป็นสตริงที่ฉันต้องใช้วัตถุ แต่แล้วมันจะส่งกลับ unaryexpression สำหรับเหล่านั้น public static RouteValueDictionary GetInfo<T>(this HtmlHelper html, Expression<Func<T, object>> action) where T : class { var expression = GetMemberInfo(action); string name = expression.Member.Name; return GetInfo(html, name); } private static MemberExpression GetMemberInfo(Expression method) { LambdaExpression lambda = method as …

1
Roslyn SyntaxNodes ถูกใช้ซ้ำหรือไม่
ฉันได้ดูRoslyn CTPแล้วและในขณะที่มันแก้ปัญหาที่คล้ายกันกับExpression tree APIทั้งสองไม่เปลี่ยนรูป แต่ Roslyn ทำในลักษณะที่แตกต่างกันมาก: Expression โหนดไม่มีการอ้างอิงไปยังโหนดหลักถูกแก้ไขโดยใช้ไฟล์ ExpressionVisitorและนั่นคือเหตุผลที่สามารถใช้ชิ้นส่วนขนาดใหญ่ซ้ำได้ SyntaxNodeอีกด้านหนึ่งของ Roslyn มีการอ้างอิงถึงพาเรนต์ดังนั้นโหนดทั้งหมดจึงกลายเป็นบล็อกที่ไม่สามารถใช้ซ้ำได้อย่างมีประสิทธิภาพ วิธีการเช่นUpdate, ReplaceNodeฯลฯ มีไว้เพื่อทำการแก้ไข เรื่องนี้จบลงที่ไหน? Document? Project? ISolution? API ส่งเสริมการเปลี่ยนแปลงทีละขั้นตอนของทรี (แทนที่จะเป็นปุ่มขึ้น) แต่แต่ละขั้นตอนทำสำเนาทั้งหมดหรือไม่ ทำไมพวกเขาถึงเลือกเช่นนั้น? มีเคล็ดลับที่น่าสนใจบางอย่างที่ฉันขาดหายไปหรือไม่?

5
Expression.Quote () ทำอะไร Expression.Constant () ไม่ได้แล้ว
หมายเหตุ: ฉันทราบถึงคำถามก่อนหน้านี้ " อะไรคือจุดประสงค์ของวิธี Expression.Quote ของ LINQ? ”แต่ถ้าคุณอ่านคุณจะเห็นว่ามันไม่ตอบคำถามของฉัน ฉันเข้าใจจุดประสงค์ที่ระบุไว้Expression.Quote()คืออะไร อย่างไรก็ตามExpression.Constant()สามารถใช้เพื่อวัตถุประสงค์เดียวกันได้ (นอกเหนือจากวัตถุประสงค์ทั้งหมดที่Expression.Constant()ใช้สำหรับ) ดังนั้นฉันไม่เข้าใจว่าทำไมจึงExpression.Quote()จำเป็นต้องมี เพื่อแสดงให้เห็นสิ่งนี้ฉันได้เขียนตัวอย่างสั้น ๆ ที่ซึ่งปกติจะใช้Quote(ดูบรรทัดที่มีเครื่องหมายอัศเจรีย์) แต่ฉันใช้Constantแทนและมันก็ทำงานได้ดีพอ ๆ กัน: string[] array = { "one", "two", "three" }; // This example constructs an expression tree equivalent to the lambda: // str => str.AsQueryable().Any(ch => ch == 'e') Expression<Func<char, bool>> innerLambda = ch …

4
LINQ to Entities รองรับเฉพาะการหล่อ EDM แบบดั้งเดิมหรือชนิดการนับด้วยอินเทอร์เฟซ IEntity
ฉันมีวิธีการขยายทั่วไปดังต่อไปนี้: public static T GetById<T>(this IQueryable<T> collection, Guid id) where T : IEntity { Expression<Func<T, bool>> predicate = e => e.Id == id; T entity; // Allow reporting more descriptive error messages. try { entity = collection.SingleOrDefault(predicate); } catch (Exception ex) { throw new InvalidOperationException(string.Format( "There was an error retrieving …


4
รวบรวม C # Lambda Expressions Performance
พิจารณาการจัดการอย่างง่ายต่อไปนี้สำหรับคอลเลกชัน: static List<int> x = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; var result = x.Where(i => i % 2 == 0).Where(i => i > 5); ตอนนี้มาใช้นิพจน์ รหัสต่อไปนี้เทียบเท่าโดยประมาณ: static void UsingLambda() { Func<IEnumerable<int>, IEnumerable<int>> lambda = l => l.Where(i => i % 2 …

8
ฉันจะใช้ OrderBy บน IQueryable โดยใช้ชื่อคอลัมน์สตริงภายในวิธีการขยายทั่วไปได้อย่างไร
public static IQueryable<TResult> ApplySortFilter<T, TResult>(this IQueryable<T> query, string columnName) where T : EntityObject { var param = Expression.Parameter(typeof(T), "o"); var body = Expression.PropertyOrField(param,columnName); var sortExpression = Expression.Lambda(body, param); return query.OrderBy(sortExpression); } เนื่องจากประเภทของ OrderBy ไม่ได้อนุมานจาก sortExpression ฉันต้องระบุสิ่งนี้ในขณะทำงาน: var sortExpression = Expression.Lambda<T, TSortColumn>(body, param); หรือ return query.OrderBy<T, TSortColumn>(sortExpression); ฉันไม่คิดว่าจะเป็นไปได้อย่างไรก็ตามเนื่องจาก TSortColumn สามารถกำหนดได้ในระหว่างรันไทม์เท่านั้น มีวิธีแก้ปัญหานี้หรือไม่?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.