我正在尝试使用MongoDB C#驱动程序2.2版.我正在尝试使用投影,因为我不想检索文档中的所有元素.我发现一种方法是使用项目运算符和find运算符,如下所示:
collection.Find(key => key.Index == 1).Project<MyClass>(Builders<MyClass>.Projection.Include(key => key.Name).Include(key => key.Index)). ToEnumerable ();
Run Code Online (Sandbox Code Playgroud)
但是,我有兴趣使用AsQueryable API以及where运算符,如下所示:
collection.AsQueryable().Where(key => key.Index == 1);
Run Code Online (Sandbox Code Playgroud)
在上述情况下是否可以使用投影?如果我使用选择运算符,它会与投影具有相同的效果吗?或者仍然会从数据库服务器获取所有元素,然后在应用程序服务器中选择指定的元素?
我在 .net core 2.1 网站中使用基于 JWT 的身份验证。目前这工作正常。现在,我必须创建一个 API 多租户,并且每个租户都将拥有自己的密钥。租户 ID 将作为参数传递给 API。
[Authorize]
[HttpGet("tenant/{id}")]
public async Task<IActionResult> GetInfo(string id)
{
}
Run Code Online (Sandbox Code Playgroud)
每个租户都会签署 JWT 并添加到授权标头。我无法想出一种根据参数更改 IssuerSigningKey 的方法。我尝试了以下操作:
通过将其设为 [ ] 来验证 API 内的 JWT AllowAonymus。这可行,但我最终编写了所有 JWT 验证代码。
实施ISecurityTokenValidator
我可以实现ISecurityTokenValidator验证令牌并在启动配置中使用它,如下所示:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
{
options.SecurityTokenValidators.Clear();
options.SecurityTokenValidators.Add(new JWTSecurityTokenValidator());
});
Run Code Online (Sandbox Code Playgroud)
并实现了我自己的类来验证令牌。
public class JWTSecurityTokenValidator : ISecurityTokenValidator
{
public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
{
// Implement the logic
}
}
Run Code Online (Sandbox Code Playgroud)
但我最终还是做了繁重的工作。另外,我无法访问 ValidateToken 中的参数“tenantId”。
3.使用IssuerSigningKeyResolver:我可以实现一个委托:
IEnumerable<SecurityKey> IssuerSigningKeyResolver(string …Run Code Online (Sandbox Code Playgroud) 使用ADO.Net Entity框架读取数据时,我遇到了一个奇怪的问题.
我有两张桌子,"Surveys"和"PatientVists"."VisitId"是"PatientVists"中的主键,它是"调查"表中的外键.
我正在使用以下查询:
foreach (var survey in db.Surveys.Include(p => p.PatientVisit).Where(p => p.FacilityId == f.Id && p.IsCompleted == true && p.IsImaged == false).OrderBy(p => p.PatientVisit.MrnId).ThenBy(p => p.DateUpdated).ToList())
{
// reminign code
}
Run Code Online (Sandbox Code Playgroud)
上面的查询似乎很正常.但是在执行查询时我得到线程中止异常.我可以理解,由于数据量很大,我是否会收到超时异常.但我不知道为什么我得到线程中止异常.我没有明确地产生一个线程.此代码段位于Web服务中,但我认为它与此无关.
以下是堆栈跟踪:
System.Threading.ThreadAbortException: Thread was being aborted.
at SNIReadSyncOverAsync(SNI_ConnWrapper* , SNI_Packet** , Int32 )
at SNINativeMethodWrapper.SNIReadSyncOverAsync(SafeHandle pConn, IntPtr& packet, Int32 timeout)
at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at …Run Code Online (Sandbox Code Playgroud) 我有学生表,我想编写一个Linq查询来获取多个计数.Linq生成的SQL查询过于复杂且未经优化.
以下是我的表的定义:
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](100) NULL,
[Age] [int] NULL,
Run Code Online (Sandbox Code Playgroud)
我需要对名为= test的学生进行一次计数,为年龄> 10的学生计算一次.这是我尝试过的一个查询:
var sql = from st in school.Students
group st by 1 into grp
select new
{
NameCount = grp.Count(k => k.Name == "Test"),
AgeCount = grp.Count(k => k.Age > 5)
};
Run Code Online (Sandbox Code Playgroud)
生成的SQL查询是:
SELECT
[Limit1].[C1] AS [C1],
[Limit1].[C2] AS [C2],
[Limit1].[C3] AS [C3]
FROM ( SELECT TOP (1)
[Project2].[C1] AS [C1],
[Project2].[C2] AS [C2],
(SELECT
COUNT(1) AS [A1]
FROM [dbo].[Student] AS [Extent3]
WHERE ([Project2].[C1] = …Run Code Online (Sandbox Code Playgroud) c# ×3
asp.net-core ×1
asqueryable ×1
jwt ×1
linq ×1
mongodb ×1
multi-tenant ×1
sql-server ×1
thread-abort ×1