我正在尝试使用.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()
组合时,会抛出错误。
我是否错误地使用了这个?
答案 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,因此如果可以推断,则无需指定连接关系。您可以通过自己指定显式连接来覆盖此行为。
由于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());
}