国产精品久久毛片因为您将认知该查询仅在脱手时的外观

发布日期:2022-04-22 20:37    点击次数:134

国产精品久久毛片

当您使用LINQ来处理数据库时,这种体验是一种神奇的体验,对吗?你把数据库实体像一个庸碌的收罗,使用Linq中像Where,Select大概 Take,这些浅薄的使用就能让代码可用了。

然而,让咱们计划一下这里是如何通过动态查询和抒发式树收尾此功能的:幕后发生的事情。您编写的LINQ查询将调养为SQL(或其他款式),并将该SQL查询发送到数据库。然后将数据库的反映映射到C#对象。然而,如何竣工调养为SQL?

在本文中,您将看到诸如Entity Framework和MongoDB C#驱动要领之类的框架如何使用抒发式树进行调养。您将看到如何躬足下用抒发式树来构建动态查询。这些查询是您无法在编译时创建的查询,因为您将认知该查询仅在脱手时的外观。

由树莓派所组成的恶意软件检测系统不拦截任何软件,也不调查流入和流出计算机的任何数据包。正如上段所说,树莓派通过分析特定的电磁(EM)波,以极高的精确度探测正在进行的恶意软件活动。

今天的很多量子计算机建造起来很复杂,很难扩大规模,并且需要比星际空间更冷的温度才能运行。这些挑战促使研究人员探索构建使用光子(光粒子)工作的量子计算机的可能性。 光子可以很容易地将信息从一个地方传递到另一个地方,光子量子计算机可以在室温下运行,因此这种方法很有希望。然而,尽管人们已经成功地为光子创建了单独的量子"逻辑门",但用 光子构建大量逻辑门并以可靠的方式连接它们以执行复杂的计算,还是一个技术难题。

2019年底,腾讯高级副总裁奚丹在中国人民大学演讲,提到腾讯人才的「四化」策略:跨界化、国际化、年轻化、特长化。

对可查询树和抒发式树进行揭秘

计划以下使用Entity Framework 6的C#代码:

SQL:SELECT     [Extent1].[StudentID] AS [StudentID],     [Extent1].[StudentName] AS [StudentName],     [Extent1].[DateOfBirth] AS [DateOfBirth],     FROM [dbo].[Students] AS [Extent1]     WHERE N'Billie' = [Extent1].[StudentName] 

请留神,WHERESQL查询中有一个操作。那不是很显然。如若SQL不包含WHERE,则通盘学生都将从数据库中带走,何况筛选将在.NET程度中扩充。践诺上,以下代码不错做到这小数:

//BAD: DbSet<Student> students = context.Students; Func<Student, bool> predicate = s => s.StudentName == "Billie"; var x = students.Where(predicate).ToList(); 

在临了一个示例中,SQL查询使通盘学生参加经过,并将其映射到老例聚会。不同之处在于,在第一段代码中,lambda是一个Expression

第二段代码在性能,内存和汇注方面很灾祸。咱们从汇注中赢得了很多对象,而不是仅从数据库中赢得一个方法。然后,咱们使用CPU将它们序列化为C#对象。并用完内存将它们存储在程度的堆中。

因此,美欧性爱让咱们回到第一段代码。如何await students.Where(s => s.StudentName == "Billie").ToListAsync()产生一个包含的SQL查询WHERE N'Billie' = [Extent1].[StudentName]?

谜底是抒发树。该代码s => s.StudentName == "Billie"践诺上是一个结构化查询,不错通过编程将其剖析为节点树。在此示例中,有6个节点。最顶层的节点是lambda抒发式。左侧是lambda参数。在它的右边是Equal示意抒发式的lambda主体。实体框架具有遍历这些抒发式树并构造SQL查询的算法。其他数据源提供要领(如Mongo DB C#驱动要领)也会发生一样的事情,除了它会构造一个MongoDB json查询。

C#抒发式树

在第一段代码中,类型s => s.StudentName == "Billie"为Expression

好的,然而我该如何利用它呢?

在大大都情况下,使用抒发树的人们即是在构建天下实体框架的人们。然而在某些特定情况下,它变得越过有效。这是咱们最近在Ozcode[1](我的通俗使命)中遭受的一个用例:

咱们想在名为Error的数据库实体上创建动态职业器端过滤。该实体具有很多属性,咱们但愿允许用户对其进行过滤。因此过滤应凭据被允许Username,Country,Version,或任何其他财产。这是咱们需要收尾的API:

IQueryable<Error> _errors;  public IEnumerable<Error> GetErrors(string propertyToFilter, string value){ /*..*/}  

在这种情况下,propertyToFilter是的属性Error。使用老例的LINQ,独一的措施即是使用弘大的switch / case语句。有点像这么:

IQueryable<Error> _errors;  public IEnumerable<Error> GetErrors(string propertyToFilter, string value) {     switch (propertyToFilter)     {         case "Username":             return await _errors.Where(e=> e.Username == value).ToListAsync();         case "Country":             return await _errors.Where(e=> e.Country == value).ToListAsync();         case "Version":             return await _errors.Where(e=> e.Version == value).ToListAsync();         // ...             } } 

您可能会原意这不是理想的采选。除了必须编写通盘这些东西以外,它还越过容易出现失误。如若添加了属性怎么办?如若重定名怎么办?通盘这个词事情一团糟。

通过动态查询和抒发式树不错收尾此功能的措施如下:

private async static Task<IEnumerable<Error>> GetErrors(string propertyToFilter, string value) {     var error = Expression.Parameter(typeof(Error));     var memberAccess = Expression.PropertyOrField(error, propertyToFilter);     var exprRight = Expression.Constant(value);     var equalExpr = Expression.Equal(memberAccess, exprRight);     Expression<Func<Error, bool>> lambda = Expression.Lambda<Func<Error, bool>>(equalExpr, error);      return await _errors.Where(lambda).ToListAsync(); } 

这里的每一滑代码代表抒发式树中的一个节点。它们共同组成了最高节点-lambda。然后,不错在LINQ中使用动态抒发式,并生成职业器端SQL查询。我以为很好。

处理此问题的另一种措施是构建自界说SQL查询字符串。在Ozcode中,咱们使用的是MongoDB,因此SQL不符合使用,但咱们不错创建一个自界说的MongoDB JSON查询字符串。也不是太难,然而我以为抒发式树措施愈加活泼和可靠。一方面,您不错将其放在LINQ中并与其他LINQ运算符组合。此外,当有诸如Entity Framework之类的经过测试的框架不错为您扩充此操作时,为什么还要编写我方的查询。

概要

回来一下。这是本文中的一些要害点:

老例函数/委用与抒发式之间的永别在于,抒发式不错用结构化树示意。不错松驰地分析该树以创建诸如数据库查询之类的东西。 撑持抒发式的数据源收尾该IQueryable接口。 如若您无法使用抒发式(以及使用老例措施或委用),则查询将在职业器端而不在数据库端,这关于性能而言将是可怕的。 使用lambda(不带主体)时,抒发式是无缝创建的,因此这些年来您可能一直都在这么做。 您不错我方使用抒发式树来创建动态查询。这在无法在编译时仅在脱手时构建查询的情况下很有效。

References

[1] Ozcode: https://oz-code.com 

[2]: https://www.mediavine.com/国产精品久久毛片



上一篇:没有了    下一篇:6080yy私人影院无码专区然则淌若一定要达成嵌套和层的功能