![](/img/trans.png)
[英]Create a dynamic UpdateOnly Expression in 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.