小编Ame*_*mey的帖子

在MongoDB C#驱动程序2.2中使用AsQueryable进行投影

我正在尝试使用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)

在上述情况下是否可以使用投影?如果我使用选择运算符,它会与投影具有相同的效果吗?或者仍然会从数据库服务器获取所有元素,然后在应用程序服务器中选择指定的元素?

c# asqueryable mongodb mongodb-.net-driver

5
推荐指数
1
解决办法
1287
查看次数

多租户Asp.net Core网站中基于参数的JWT认证

我在 .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 的方法。我尝试了以下操作:

  1. 通过将其设为 [ ] 来验证 API 内的 JWT AllowAonymus。这可行,但我最终编写了所有 JWT 验证代码。

  2. 实施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)

c# multi-tenant jwt asp.net-core

4
推荐指数
1
解决办法
2895
查看次数

ADO.Net实体框架线程在读取数据时中止异常

使用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)

entity-framework thread-abort

3
推荐指数
1
解决办法
3495
查看次数

改进LINQ生成的SQL查询到EF

我有学生表,我想编写一个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# linq sql-server entity-framework

1
推荐指数
1
解决办法
108
查看次数