首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lambda包含在SimpleRepository.Find中

Lambda包含在SimpleRepository.Find中
EN

Stack Overflow用户
提问于 2010-05-20 16:25:25
回答 3查看 1.5K关注 0票数 2

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

代码语言:javascript
复制
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();

我得到了错误消息:

变量'x‘的类型’用户‘引用范围’,但它没有定义

我是在这里遗漏了什么,还是SubSonic在lambda表达式中不支持Contains?若否,如何处理呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-20 17:29:22

既然这两种方法都不管用..。

代码语言:javascript
复制
x => guids.Contains(x.Guid)
x => guids.Any(y => y == x.Guid)

..。我们编写了一个自定义lambda表达式生成器,它生成:

代码语言:javascript
复制
x => x.Id == {id1} OR x.Id == {id2} OR x.Id == {id3}

这是一个简单的场景,但演示了GetContainsId<User>(ids, repo)将如何找到所有Id与提供的列表中的内容相匹配的用户。

代码语言:javascript
复制
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));
}
票数 4
EN

Stack Overflow用户

发布于 2010-05-20 17:07:10

Subsonic可能无法转换userIds.Contains,因为它无法将该列表转换为可以在SQL数据库上执行的内容。您可能需要明确地定义一个或一个条件:

代码语言:javascript
复制
repo.Find<User>(x => x.Id == 1 || x.Id == 3).ToList();
票数 0
EN

Stack Overflow用户

发布于 2010-05-20 19:15:04

我非常肯定,如果您使用的是IEnumerable而不是列表,这将是可行的。因此,以下几点应能奏效:

代码语言:javascript
复制
SimpleRepository repo = new SimpleRepository("ConnectionString");

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

List<User> users = repo.Find<User>(x => userIds.Contains(x.Id)).ToList();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2875787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档