Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SimpleRepository.Find中包含Lambda_C#_Subsonic_Lambda_Simplerepository - Fatal编程技术网

C# SimpleRepository.Find中包含Lambda

C# SimpleRepository.Find中包含Lambda,c#,subsonic,lambda,simplerepository,C#,Subsonic,Lambda,Simplerepository,在亚音速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.Fin

在亚音速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();
SimpleRepository回购=新的SimpleRepository(“连接字符串”);
List userid=new List();
userid.Add(1);
userid.Add(3);
List users=repo.Find(x=>userIds.Contains(x.Id)).ToList();
我收到错误消息:

从作用域“”引用了类型为“User”的变量“x”,但未定义该变量


我在这里遗漏了什么,或者亚音速不支持lambda表达式中的
Contains
?如果没有,这将如何实现?

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

repo.Find<User>(x => x.Id == 1 || x.Id == 3).ToList();
repo.Find(x=>x.Id==1 | | x.Id==3.ToList();

因为这两种方法似乎都不起作用

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(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));
}
public List GetContainsId(列表id,SimpleRepository repo)
其中T:Record,new()/`Record`是具有属性Id的基类
{
ParameterExpression x=表达式参数(类型为(T),“x”);
LambdaExpression-expr;
如果(ids.Count==0)
{
expr=Expression.Lambda(LambdaExpression.Constant(false),x);
}
其他的
{
expr=Expression.Lambda(BuildEqual(x,ids.ToArray()),x);
}
返回repo.Find((表达式)expr.ToList();
}
私有二进制表达式BuildEqual(参数表达式x,int-id)
{
MemberExpression left=Expression.Property(x,“Id”);
ConstantExpression right=表达式常数(id);
返回表达式.Equal(左、右);
}
私有二进制表达式BuildEqual(参数表达式x,int[]id,int pos=0)
{
int id=id[pos];
pos++;
if(pos==ids.Length)
{
返回BuildEqual(x,id);
}
返回表达式.OrElse(BuildEqual(x,ids,pos),BuildEqual(x,id));
}

如果使用IEnumerable而不是List,我很确定这会起作用。因此,以下措施应该有效:

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();
SimpleRepository回购=新的SimpleRepository(“连接字符串”);
IEnumerable userIds=新列表();
userid.Add(1);
userid.Add(3);
List users=repo.Find(x=>userIds.Contains(x.Id)).ToList();

为他们感到羞耻……这并不是说Rob不知道这对我不起作用,除非我的代码有其他问题。你确定吗?(还有,亚音速3.1进展如何?)。在示例中已修复。