首页 > 解决方案 > 如何根据多个条件使用 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));

我想要做的是productWatchedProducts列表中找到特定的。它的模型如下所示:

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

标签: c#asp.net-mvclinqasp.net-identity

解决方案


发生这种情况是因为您使用的是 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...

推荐阅读