在 Visual Studio 中使用 Linq 和 Marten 查询多个参数

Posted

技术标签:

【中文标题】在 Visual Studio 中使用 Linq 和 Marten 查询多个参数【英文标题】:Querying multiple parameters using Linq with Marten in Visual Studio 【发布时间】:2017-05-02 03:56:37 【问题描述】:

我正在学习文档数据库,我们在 Visual Studio 中使用 Marten/Linq。数据库通过 Postgres/PGAdmin 运行。我的数据库是足球(不是美国)联赛、球队、球员和经理。我正在尝试基于多个参数构建查询。我有很好的奇异参数。

List<Player> englishPlayers = finalDb.Query<Player>().Where(x => x.Nationality.Contains("English")).ToList();

此查询将在文档数据库中创建国籍设置为“英语”的所有玩家的列表。

玩家是我的班级/桌子,带有国籍“字段”。我想做的是基于多个参数的查询。例如,我有多个“字段”,它们是 int 或 bool。举个例子,如果我想创建一个查询来显示某个国籍且lifetimeGoals > 100 的所有玩家,我将如何实现呢?

我在 Google 上搜索了大约一个小时,并通读了建议的类似问题,但其中大多数问题并未说明使用 Marten。

我尝试过先将其分解为单个查询,然后将它们组合起来,例如:

Player m4 = finalDb.Query<Player>().SelectMany(e => e.lifetimeGoals
                .Where(p => e.lifetimeGoals >= 0));

但是,这会引发错误说明

int 不包含 where 的定义,也没有扩展方法 'Where' 接受'int' 类型的第一个参数。

我的术语有点不对劲,但希望这足够清楚,可以找到指导。

播放器类:

class Player

    public int Id  get; set; 
    public string Name  get; set; 
    public int Age  get; set; 
    public string Team  get; set; 
    public string prefPosition  get; set; 
    public string Nationality  get; set; 
    public int yearsAtCurrentClub  get; set; 
    public int lifetimeGoals  get; set; 
    public int domesticTitles  get; set; 
    public int europeanTitles  get; set; 
//Class Player

主类

static void Main(string[] args)
    

        string connectionString = ConfigurationManager.ConnectionStrings
        ["FinalProjectDB"].ConnectionString;
        IDocumentStore store = DocumentStore.For(connectionString);

        using (var finalDb = store.OpenSession())
        
        Player m4 = finalDb.Query<Player>().SelectMany(p => p.lifetimeGoals)
                    .Where(p => p.lifetimeGoals >= 0 && p.myString.Equals("valueToCheck"));

 Console.ReadLine();
 

【问题讨论】:

【参考方案1】:

您不能在整数上使用.Where()。而是像这样使用它:

Player m4 = finalDb.Query<Player>().SelectMany(e => e.lifetimeGoals)
            .Where(p => p.lifetimeGoals >= 0);

上述查询在SelectMany 的末尾有一个右括号,允许Where 子句与预期的查询一起使用。

由于在SelectMany 末尾添加了一个括号,因此不需要在查询末尾添加一个额外的括号。

编辑:您可以简单地将另一个子句添加到您的.Where()

Player m4 = finalDb.Query<Player>().SelectMany(e => e.lifetimeGoals)
            .Where(p => p.lifetimeGoals >= 0 && p.myString.Equals("valueToCheck"));

您可以将&amp;&amp; 用于,也可以将|| 用于

第二次编辑:我不明白你为什么使用.SelectMany()。您应该能够像这样使用您的查询:

Player m4 = finalDb.Query<Player>().Where(p => p.lifetimeGoals >= 0 && p.myString.Equals("valueToCheck")).FirstOrDefault();

或者当你想要一个玩家列表时使用.ToList()

List<Player> players = finalDb.Query<Player>().Where(p => p.lifetimeGoals >= 0 && p.myString.Equals("valueToCheck")).ToList();

【讨论】:

好的,太好了。谢谢。在同一个语句中结合字符串检查和 int 检查怎么样?我已经想出了如何根据您的响应组合 int 检查,但是当我尝试在同一个查询中合并一个字符串检查时,它告诉我 抱歉,不知道为什么它不允许我编辑我的其他帖子,错误是“'bool' 不包含“ToList”的定义,并且没有扩展方法 'ToList' 接受第一个参数“布尔”的类型” 查看我的编辑以获取您的第一条评论。以及如何在声明中使用.ToList() 因为它是一个文档数据库并且我有很多值,所以我将与查询匹配的所有内容添加到列表中,并使用 foreach 循环逐行打印每个结果。 我问你如何?而不是为什么?

以上是关于在 Visual Studio 中使用 Linq 和 Marten 查询多个参数的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio Code 中从 NPM 包自动导入

Visual Studio 调试“快速观察”工具和 lambda 表达式

如何使用Visual Studio 2017构建Gtk#/ Mono应用程序

即使 using 语句不存在,Visual Studio 2010 扩展也可将扩展方法添加到智能感知

简单的 C# 应用程序无法正常工作,在 Visual Studio 中运行时工作正常

Visual Studio for Mac:缓存位置