在 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"));
您可以将&&
用于和,也可以将||
用于或。
第二次编辑:我不明白你为什么使用.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 扩展也可将扩展方法添加到智能感知