c# - 如何根据多个条件使用 Linq 查找特定项目?
问题描述
我有一个非常简单的查询:
//user from UserManager from default AccountController from .net Identity
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
var product = await Task.Run(()
=> db.WatchedProducts.Where(u => u.ApplicationUserId == user.Id && u.ProductId == id));
我想要做的是product
在WatchedProducts
列表中找到特定的。它的模型如下所示:
public class WatchedProduct
{
[Key]
public int Id { get; set; }
[ForeignKey("ApplicationUser")]
public string ApplicationUserId { get; set; }
public virtual ApplicationUser ApplicationUser { get; set; }
[ForeignKey("Product")]
public int ProductId { get; set; }
public virtual Product Product { get; set; }
}
ApplicationUser
有清单WatchedProducts
。
我的问题是,为什么不让WatchedProduct product
我得到一个IQueryable<WatchedProduct> product
?
解决方案
发生这种情况是因为您使用的是 method Where()
。Where()
方法根据您的 lambda 表达式过滤您的数据=> u.ApplicationUserId == user.Id && u.ProductId == id
并返回IQueryable<TSource>
或IEnumerable<TSource>
(请参阅 Reza Aghaei 的回答中的精彩解释)。
如果您想获得 WaterProduct 产品,那么只需通过FirstOrDefault()
以下方法获得它:
var product = await Task.Run(()
=> db.WatchedProducts.Where(u => u.ApplicationUserId == user.Id && u.ProductId == id)
.FirstOrDefault());
您没有获得任何数据,因为您没有具体化您的查询。它被称为延迟执行。延迟执行意味着在您需要必要的数据之前,您的 linq 代码不会在数据库中执行。因此,要在数据库中实现数据或执行查询,您应该调用如下方法:
foreach, toList(), First(), FirstOrDefault(), Single(), SingleOrDefault(), etc...
推荐阅读
- vue.js - 在 Vue 组件中通过 Vuex 存储中的数组填充时,默认选择第一个索引的选项
- java - 编写一个名为 Child 的简单接口(其中没有任何内容)并使用它来创建一个 ArrayList 可以仅存储 Boy 和 Girl 的实例
- javascript - 如何从 Python 中的 .js 文件中解析 JavaScript 对象?
- android - Camera API 1 和 Camera API 2 返回不同的传感器方向信息
- typescript - 我不知道在 axios promise 参数中声明什么?
- mysql - mysql创建表并为索引设置createtime(int),但选择不使用,为什么?
- python - 如何在面板文件输入小部件中访问选定的文件名?
- python - 如何在 Scrapy 中修复 403 响应
- curl - 使用邮递员时发布请求中的禁止错误,但在 curl 中没有
- python - 我在将 csv 文件写入 MongoDB 时遇到问题