ParseQuery WhereEqualTo不过滤?

时间:2015-03-24 08:12:32

标签: c# parse-platform xamarin

我是Parse.com的新手,我遇到了一些问题。我试图从数据库中获取布尔Deleted等于false的所有记录。但这似乎并没有任何作用。 例如:

ParseQuery<ParseObject> query = ParseObject.GetQuery("Horse");
query.WhereEqualTo("Deleted", "false");
IEnumerable<ParseObject> horses = await query.FindAsync();

当我用三条记录运行时,其中两条记录是假的,一条是真的,我仍然得到所有三条记录。这是我的测试数据: Demo data 我已经为此查询尝试了多种方法,例如:

query.WhereNotEqualTo("Deleted", "true");
query.WhereNotEqualTo("Deleted", true);
query.WhereEqualTo("Deleted", false);

但这些似乎都不起作用。我究竟做错了什么?我希望保留Boolean字段和这些查询。另一个奇怪的事情是,当我创建自己的查询并创建一个整数字段时,例如搜索&#39;过滤器&#39;做的工作:

var query2 = from gameScore in ParseObject.GetQuery("Horse")
             where gameScore.Get<string>("Removed") == "1"
             select gameScore;
IEnumerable<ParseObject> results = await query2.FindAsync();

那么为什么这会有用,但ParseQuery却没有?我想要写一个ParseQuery只能获取与false匹配的记录,或者自己写一个与之匹配的查询。

更新 每个请求添加了新的查询样本。 &#34;&#34;

之间的封装值
ParseQuery<ParseObject> query = ParseObject.GetQuery("Horse");
query.WhereEqualTo("Deleted", "false");
IEnumerable<ParseObject> horses = await query.FindAsync();

没有&#34;&#34;对于虚假陈述:

ParseQuery<ParseObject> query = ParseObject.GetQuery("Horse");
query.WhereEqualTo("Deleted", false);
IEnumerable<ParseObject> horses = await query.FindAsync();

即使Deleted为真,这两个值都会返回所有值。

谢谢, Yenthe

4 个答案:

答案 0 :(得分:0)

如果您的列属于Boolean类型,那么whereEqualTo("Deleted", false)whereNotEqualTo("Deleted", true)应该可以正常工作。虽然字符串版本不起作用,或者可以使用&#34; truthy / falsey&#34;逻辑(虽然我认为这只是JavaScript,而不是C#)。

使用原生C#bool值而不是字符串再次尝试查询。

答案 1 :(得分:0)

应该在WhereEqualTo()中大写?没有阅读api文档,但通常使用驼峰案例。

答案 2 :(得分:0)

您的查询的问题是您在添加其他过滤器后未存储查询。添加过滤器时,会修改查询并返回,并且需要将此返回值指定为新查询。

...
query = query.WhereEqualTo("Deleted", false);
...

请注意,您可以链接查询过滤器,因此您的代码代码可以修改为:

ParseQuery<ParseObject> query = ParseObject.GetQuery("Horse")
    .WhereEqualTo("Deleted", false);
IEnumerable<ParseObject> horses = await query.FindAsync();

只要过滤器不会相互冲突,您就可以根据需要链接任意数量的查询过滤器。 (您必须查看兼容过滤器的文档)

不得不重新分配可能看起来像一种奇怪的方法,但我想这样你就可以用许多常见的过滤器创建一个单一的基本查询,然后轻松地分出更多的利基选项:

// Create a base query
var baseQuery = new ParseQuery<Horse>();
// Add many common filters

var removedHorses = query.WhereEqualTo("Deleted", true);
var remainingHorses = query.WhereEqualTo("Deleted", false);
var sickHorses = query.WhereEqualTo("Health", "Sick");
// And so on

答案 3 :(得分:0)

试试这种方式

ParseQuery<ParseObject> query = ParseObject.GetQuery("Horse");

IEnumerable<ParseObject> horses = await query.WhereEqualTo("Deleted", "false").FindAsync();

它对我有用,如下例所示:

ParseQuery<Classes.PermissoesGerenciarMedicos> queryPermissoesMedicos = new ParseQuery<Classes.PermissoesGerenciarMedicos>();
            queryPermissoesMedicos.WhereEqualTo("usuario", ParseUser.CurrentUser as Classes.Usuario).FindAsync().ContinueWith(resultado => {
                if (resultado.IsCompleted && !resultado.IsFaulted)
                {
                    if (resultado.Result.Count() == 1)
                    {
                        permissoesGerenciarMedicos = resultado.Result.ElementAt(0) as Classes.PermissoesGerenciarMedicos;
                        carregaPermissoesUsuarios();
                    }
                    else
                    {
                        MessageBox.Show("Erro ao carregar as permissões do usuário", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);

                        processandoDadosDelegate processandoDadosD = new processandoDadosDelegate(processandoDados);
                        this.Invoke(processandoDadosD, new object[] { false });
                    }
                } else
                {
                    MessageBox.Show("Erro ao carregar as permissões do usuário", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    processandoDadosDelegate processandoDadosD = new processandoDadosDelegate(processandoDados);
                    this.Invoke(processandoDadosD, new object[] { false });
                }
            });