MongoDB C#Driver 2.0:为什么我不能在Query中使用布尔方法?

时间:2015-11-11 12:15:57

标签: c# mongodb linq

我正在使用C#MongoDB驱动程序版本2.1.0,并且遇到以下问题:我有一个静态类来处理数据库连接等,我公开了如下属性,

public static class StaticMongo {

    private readonly static MongoClient Client;
    private readonly static IMongoDatabase Database;

    public static IMongoQueryable<Game> GetGames { 
        get {
            return Database.GetCollection<Game>("Games").AsQueryable();
        } 
    }
    // ...
}

每个Game都有一个Player列表,其中包含Name属性(以及更多,ofc)。访问数据时,例如,从Player获取名为_name的所有Games个实例,以下作品:

var a = StaticMongo.GetHands.
    Where(n => (int)n.GameType == i).
    //Where(n => GamePassesFilter(n, true)).
    SelectMany(n => n.Players).
    Where(n => n.Name == _name).ToList();

但如果我还想过滤它们(即,如果我包含注释行),就像这样,

private bool GamePassesFilter(Game _game, bool _manyAllowed) {
    var _playersInGame = _game.Players.Count();
    if (_manyAllowed && (_playersInGame == 5 ||_playersInGame == 6)) return true;
    return false;
}

我得到一个例外。为什么?如何正确处理?

  

在System.ArgumentException中,请使用Ausnahme vom Typ   “MongoDB.Driver.dll”aufgetreten,doch wurde diese im Benutzercode   nicht verarbeitet。

     

ZusätzlicheInformationen:不支持的过滤器:   值(MGM8.ViewModels.PlayersViewModel).GamePassesFilter([文件])。

1 个答案:

答案 0 :(得分:0)

FilterDefinition方法中的用户功能无法转换为驱动程序PredicateTranslator中的GamePassesFilter

如果您被允许这样做,可以在此之前致电AsEnumerable()使用StaticMongo.GetHands.AsEnumerable().Where(n => GamePassesFilter(n, true))...

StaticMongo.GetHands.Where(n => n.Players.Count() == 5 || n.Players.Count() == 6 && _manyAllowed)...

或者,您可以在查询中写下所有条件。

{{1}}