c# - 这两个 LINQ 查询有什么区别以及如何正确优化它们?
问题描述
我有一个客户表,其中包含以下列:Id、FirstName、LastName、CurrencyId、Gender。
我想选择与 ID 10 对应的客户货币,所以我正在做这样的事情:
var currencyId = Db.Clients.FirstOrDefault(c=>c.Id == 10)?.CurrencyId;
此行是从 Db 中获取所有属性并在代码中选择货币还是在数据库中执行类似的操作:
SELECT currencyId FROM Client WHERE ID = 10
或者我应该这样写 linq:
var currencyId = Db.Clients.Where(c=>c.Id == 10).Select(c=>c.CurrnecyId).FirstOrDefault();
这两个查询有什么区别?将上述 SQL 查询转换为 linq 查询的正确方法是什么?
解决方案
我自己调查了一下,因为我发现大多数人的答案都是有问题的。我希望将FirstOrDefault
结果具体化(您还可以从不再使用查询对象的类型中看到),这意味着它会查询所有属性。
与第二个查询不同,您在过滤您喜欢的属性时仍在使用查询,因此取决于实现,它可用于过滤属性和选择特定字段。
以下是使用 EF 为两个类似查询生成的查询示例,其中显示两者都生成不同的查询:https ://dotnetfiddle.net/5aFJAZ
推荐阅读
- common-workflow-language - Dockstore CWL 输出文件的奇怪行为
- c# - Nuget dll地狱:如何解决“无法加载文件或程序集'System.Threading.Tasks.Extensions,版本= 4.5.4.0”
- javascript - 如何识别 Busy Indicator 是在组件级别还是在整个 UI 级别使用来设置 aria 属性
- javascript - 如何以与解决方案相同的时间顺序捕获被拒绝的承诺?
- ios - Apple TV 和 WKWebView
- typescript - 如何告诉 Typescript 可以使用字符串类型而不是 `#${string}`?
- kubernetes - 如何将 Kubernetes 服务 TargetPort 定义为字符串?
- asp.net - 如何正确地向 HttpActionDescriptor ExecuteAsync 提供参数?
- python - 可绘制的可滚动窗口未呈现
- javascript - Vue 2子和父两路同步