gpt4 book ai didi

c# - 将对象的 linq 表达式应用于项目列表,其中该对象是项目的属性(包装器)

转载 作者:行者123 更新时间:2023-11-30 14:16:06 24 4
gpt4 key购买 nike

我需要能够将属性的表达式应用于该属性的包装器,下面是一个示例;一个数字列表和一个列表包装数字,其中表达式是 [where numbers are even]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

namespace ExpressionTest
{
class Program
{
static void Main(string[] args)
{
/* Expression */
Expression<Func<int, bool>> expression = item => item % 2 == 0;


/* List */
IList<int> items = new List<int>();
for (int i = 0; i < 10; i++)
{
items.Add(i);
}
IEnumerable<int> evenNumbers = items.Where(expression.Compile());
foreach (int number in evenNumbers)
{
Console.WriteLine(number.ToString());
}


/* Wrappers List */
// How to apply expression to the porpery 'Number'?
IList<Wrapper> wrappers = new List<Wrapper>();
for (int i = 0; i < 10; i++)
{
wrappers.Add(new Wrapper { Number = i });
}
IEnumerable<int> evenWrappedNumbers = ????;
foreach (Wrapper wrappedNumber in evenWrappedNumbers)
{
Console.WriteLine(wrappedNumber.ToString());
}
}
}

public class Wrapper
{
public int Number;
}
}

最佳答案

这应该可以解决问题:

Func<int, bool> predicate = expression.Compile();
IEnumerable<Wrapper> evenWrappedNumbers = wrappers.Where(w => predicate(w.Number));

或者如果您确实想要 IEnumerable<int>

Func<int, bool> predicate = expression.Compile();
IEnumerable<int> evenWrappedNumbers = wrappers.Where(w => predicate(w.Number)).Select(w => w.Number);

编辑:由于了解到正在使用 NHibernate,这里是另一种可能的解决方案。请记住,我不使用 NHibernate 并且对表达式树的经验有限。但无论如何,这应该有望允许 NHibernate 将表达式树解析为 SQL。

首先像这样在静态类中定义一个扩展方法:

    public static IQueryable<T> Where<T, TProperty>(this IQueryable<T> source,
Expression<Func<T, TProperty>> propertySelector,
Expression<Func<TProperty, bool>> predicate)
{
MemberExpression member = propertySelector.Body as MemberExpression;

if (member == null)
throw new ArgumentException("Must be a property selector", "propertySelector");

string propertyName = member.Member.Name;

// The input type
ParameterExpression propertyParameter = Expression.Parameter(typeof(T));

// The property on that type
MemberExpression itemProperty = Expression.Property(propertyParameter, propertyName);

// Invoke the specified predicate with the property from the input type
InvocationExpression invokeExpression = Expression.Invoke(predicate, itemProperty);

// The lambda expression for use with Linq
Expression<Func<T, bool>> finalExpression = Expression.Lambda<Func<T, bool>>(invokeExpression, propertyParameter);

return source.Where(finalExpression);
}

然后可以像这样使用这个扩展方法:

    IEnumerable<Wrapper> evenWrappedNumbers = wrappers.Where(w => w.Number, expression);

正如我所说,我没有使用 NHibernate 的经验,但希望它能够解析这个表达式树并将其转换为 SQL。

关于c# - 将对象的 linq 表达式应用于项目列表,其中该对象是项目的属性(包装器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8271592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com