gpt4 book ai didi

c# - Lambda 包含在 SimpleRepository.Find 中

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

在 SubSonic 3.04 的 SimpleRepository 中,我似乎无法在 lambda 表达式中执行 Contains 操作。这是一个简单的例子:

SimpleRepository repo = new SimpleRepository("ConnectionString");

List<int> userIds = new List<int>();
userIds.Add(1);
userIds.Add(3);

List<User> users = repo.Find<User>(x => userIds.Contains(x.Id)).ToList();

我收到错误信息:

variable 'x' of type 'User' referenced from scope '', but it is not defined

我是不是遗漏了什么,或者 SubSonic 不支持 lambda 表达式中的 Contains?如果没有,这将如何完成?

最佳答案

因为这些似乎都不起作用......

x => guids.Contains(x.Guid)
x => guids.Any(y => y == x.Guid)

...我们编写了一个自定义的 lambda 表达式生成器来生成:

x => x.Id == {id1} OR x.Id == {id2} OR x.Id == {id3}

这是一个微不足道的场景,但展示了如何 GetContainsId<User>(ids, repo)将找到 ID 与提供的列表中的内容匹配的所有用户。

public List<T> GetContainsId<T>(List<int> ids, SimpleRepository repo)
where T : Record, new() // `Record` is a base class with property Id
{
ParameterExpression x = Expression.Parameter(typeof(T), "x");
LambdaExpression expr;
if (ids.Count == 0)
{
expr = Expression.Lambda(LambdaExpression.Constant(false), x);
}
else
{
expr = Expression.Lambda(BuildEqual(x, ids.ToArray()), x);
}

return repo.Find<T>((Expression<Func<T,bool>>)expr).ToList();
}

private BinaryExpression BuildEqual(ParameterExpression x, int id)
{
MemberExpression left = Expression.Property(x, "Id");
ConstantExpression right = Expression.Constant(id);
return Expression.Equal(left, right);
}

private BinaryExpression BuildEqual(ParameterExpression x, int[] ids, int pos = 0)
{
int id = ids[pos];
pos++;

if (pos == ids.Length)
{
return BuildEqual(x, id);
}

return Expression.OrElse(BuildEqual(x, ids, pos), BuildEqual(x, id));
}

关于c# - Lambda 包含在 SimpleRepository.Find 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2875787/

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