繁体   English   中英

使用ServiceStack构建OrmLite的表达式

[英]Building an Expression for OrmLite with ServiceStack

我正在尝试使用db.Select<>() .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() ,将引发错误。

我使用不正确吗?

您无法查询Collection来执行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的隐式引用约定,因此,如果可以推断出连接关系,则无需指定该关系。 您可以通过自己指定显式联接来覆盖此行为。

查询膨胀的复杂类型

由于SQL不允许查询文本Blob,因此如果WinHistory集合是blobled复杂类型,那么您将只能使用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());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM