c# - 针对 POCO 进行模式匹配的库

标签 c# pattern-matching

<分区>

是否有人知道 .NET 库可以针对对象图提供良好的模式匹配(想想对象而不是文本的正则表达式)?

我能想到的最接近的是Ometa ,但 .NET 版本似乎已奄奄一息。

编辑

这个问题与我正在研究的一个想法有关,该想法更多地处于研发阶段。有问题的应用程序接受 specifications并将它们传递到存储库,然后存储库使用 Entity Framework 将它们(使用它们的 lambda)转换为 SQL。

作为一种通用技术,这可以正常工作。但是,对于某些查询,结果非常慢。这个想法是在存储库中有一些优化规则来检查传入的规范是否与优化的手写查询之一匹配。

举个例子,假设我们正在为一个如下所示的模型使用规范:

 class Person
 {
     public string FirstName { get; set; }
     public string LastName { get; set; }
     List<PhoneNumber> PhoneNumbers { get; set; }
 }

 class PhoneNumber
 {
     public string Number { get; set; }
     public PhoneNumberType PhoneNumberType { get; set; }
 }

 enum PhoneNumberType
 {
      Cell,
      Landline
 }

然后我们的基本规范是:

 interface ISpecification<T>
 {
     Expression<Func<T,bool>> Predicate { get; }
 }

 class GetPersonByPhoneNumberTypeSpecification : ISpecification<Person>
 {
      public PhoneNumberType PhoneNumberType { get; set; }

      public Expression<Func<Person,bool>> Predicate
      {
            return a => a.PhoneNumbers.Any(b => b.PhoneNumberType == PhoneNumberType);
      }
 }

 class GetPersonRequest
 {
      ISpecification Specification { get; set; }
 }

在存储库中,我们可能有一个手写查询来选择具有与其关联的特定电话号码类型的人,并且如果查询匹配则希望使用它。

整个观点无需编写大量代码来检查整个可组合规范,即给定的请求具有给定的“形状”。想象一下像这样的对象匹配语言。

另一种思考方式很可能是对对象而不是 XML 的 XPath 查询。

最佳答案

我不相信这不能仅仅通过 linq 来实现。

但是你可以实现 Interpreter pattern .

关于c# - 针对 POCO 进行模式匹配的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13237861/

相关文章:

c# - 代码分析规则 CA2000/CA 2202

scala - scala 是否支持多个模式匹配的一个默认子句?

F# 对具有类型约束的泛型类进行模式匹配

c# - 本地常量初始化为空引用

c# - 使用 SubSonic 存储库在 POCO 中加载子集合的正确方法是什么?

模式匹配中的 Haskell (n+1)

powershell - 有效提取匹配行,包括路径和行号?

scala - 如何在 for 理解中对多个事物进行模式匹配

c# - 使用 MarshalAs(UnmanagedType.LPWStr) 会清理内存吗?

c# - 尝试插入我的数据失败