c# - 如何从 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).???;
我可以在标记后添加什么?获取数据。太感谢了
解决方案
您必须了解查询和查询结果之间的区别。
查询不代表数据本身,它代表获取一些数据的潜力。
如果您仔细查看 LINQ 方法,您会发现有两组:返回的 LINQ 方法IQueryable<...>
和其他方法。
IQueryable 方法不执行查询。这些函数称为惰性函数,它们使用延迟执行。您可以在每个 LINQ 方法的备注部分中找到这些术语。
只要您连接 IQueryable LINQ 方法,就不会执行查询。在单独的语句中连接 LINQ 方法的成本并不高。
只要您开始枚举查询,就会执行查询。在最低级别,这是使用GetEnumerator
and完成的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>
. 您必须使用一种other
LINQ 方法来执行查询。
要获取查询中的所有职位:
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);
}
推荐阅读
- javascript - 一旦不和谐机器人重新连接而不是一个,如何修复发送的多条消息?
- algorithm - Given a tree find the product of two values in the subtree rooted at a particular node such that the product has minimum number of zeros?
- java - 使用 web.xml 在 OSGi Jetty 上实现 REST
- python-3.x - 将 pandas 数据框导出到 Excel 并设置列宽和文本换行
- php - MPGS 集成 CREATE_CHECKOUT_SESSION cURL
- linux - 使用 arm-poky-linux-g++ 交叉编译 boost 库
- flutter - 如何正确更改后颤应用程序启动器图标颜色
- typescript - 条件类型声明
- visual-studio - Microsoft.UI.Xaml 兼容性问题
- docker - Rancher 机器重新启动时未显示集群