使用ServiceStack为OrmLite构建表达式

时间:2014-07-15 01:04:31

标签: c# servicestack ormlite-servicestack

我正在尝试使用.And()构建表达式并传递给db.Select<>()。引发的错误是:

  

从范围''引用的'Proj1.Player'类型的变量'q',但是   它没有定义

以下代码:

Expression<Func<Player, bool>> exp = (q => q.ClientId == request.ClientId);

if (request.IsWinner.HasValue)
    if (request.IsWinner.Value)
    {
        if (game != null)
            exp = exp.And(q => q.WinHistory.Any(y => y.GameId == game.Id));
        else
            exp = exp.And(x => x.WinHistory.Any());
    }
    else
    {
        exp = exp.And(x => x.WinHistory.IsEmpty());
    }


var players = Db.Select<Player>(exp);

基本表达式正常工作。但是,当它与.And()组合时,会抛出错误。

我是否错误地使用了这个?

1 个答案:

答案 0 :(得分:1)

您无法在集合上查询以执行JOIN查询,您需要使用以下内容显式指定所需的JOIN查询:

if (request.Winner == true)
{
    q.Join<WinHistory>(); //uses implicit reference convention

    if (game != null)
        q.And<WinHistory>(w => w.GameId = game.Id);
}
else
{
    q.LeftJoin<WinHistory>()
     .And<WinHistory>(w => w.Id == null);
}

var players = db.Select(q);

以上使用了OrmLite的implicit reference convention,因此如果可以推断,则无需指定连接关系。您可以通过自己指定显式连接来覆盖此行为。

查询blobbed Complex Type

由于SQL不允许查询文本blob,如果WinHistory集合是一个blobbed复杂类型,那么你只能使用Linq2Objects过滤客户端上的集合(即从数据库返回后) ,例如:

var players = db.Select<Player>(q => q.ClientId == request.ClientId);

if (request.IsWinner != null)
{
    players = request.IsWinner.Value
      ? players.Where(x => x.WinHistory.Any(y => y.GameId == game.Id)).ToList()
      : players.Where(x => x.WinHistory.Any().ToList()
}
else
{
    players = players.Where(x => x.WinHistory.IsEmpty());
}