首页 > 解决方案 > 如何从 linq 获取数据

问题描述

我正在尝试从 asp.net 核心中的 linq 获取数据。我有一个带有 FacultyID 字段的 Position 表,如何从具有现有用户 ID 的 Position 表中获取它。我的查询

        var claimsIdentity = _httpContextAccessor.HttpContext.User.Identity as ClaimsIdentity;
        var userId = claimsIdentity.FindFirst(ClaimTypes.NameIdentifier)?.Value.ToString();
        var data = _context.Positions.Where(p => p.UserID.ToString() == userId).Select(x => x.FacultyID).???;

我可以在标记后添加什么?获取数据。太感谢了

标签: c#asp.netasp.net-mvclinqasp.net-core

解决方案


您必须了解查询和查询结果之间的区别。

查询不代表数据本身,它代表获取一些数据的潜力

如果您仔细查看 LINQ 方法,您会发现有两组:返回的 LINQ 方法IQueryable<...>和其他方法。

IQueryable 方法不执行查询。这些函数称为惰性函数,它们使用延迟执行。您可以在每个 LINQ 方法的备注部分中找到这些术语。

只要您连接 IQueryable LINQ 方法,就不会执行查询。在单独的语句中连接 LINQ 方法的成本并不高。

只要您开始枚举查询,就会执行查询。在最低级别,这是使用GetEnumeratorand完成的MoveNext / Current

IQueryable<Customer> customers = ...; // Query not executed yet!

// execute the query and process the fetched data
using (IEnumerator<Customer> enumerator = customers.GetEnumerator())
{
    while(enumerator.MoveNext())
    {
        // there is a Customer, it is in property Current:
        Customer customer = enumerator.Current;
        this.ProcessFetchedCustomer(customer);
    }
}

当您使用foreach或不返回的 LINQ 方法之一IQueryable<...>(如 ToList、ToDictionary、FirstOrDefault、Sum、Any,...

var data = dbContext.Positions
    .Where(p => p.UserID.ToString() == userId)
    .Select(x => x.FacultyID);

如果您使用调试器,您会看到这data是一个IQueryable<Position>. 您必须使用一种otherLINQ 方法来执行查询。

要获取查询中的所有职位:

List<Position> fetchedPositions result = data.ToList();

如果您只期望一个职位:

Position fetchedPosition = data.FirstOrDefault();

如果您想知道是否有任何职位:

if (positionAvailable = data.Any())
{
    ...
}

请注意:如果您使用IQueryable,数据将从 DbContext 中再次获取。因此,如果您想有效地执行所有三个语句,请确保您不使用原始数据三次:

List<Position> fetchedPositions result = data.ToList();
Position firstPosition = fetchedPostion.FirstOrDefault();
if (firstPosition != null)
{
    ProcessPosition(firstPosition);
}

推荐阅读