用于模式匹配POCO的库

时间:2012-11-05 18:09:37

标签: c# pattern-matching

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

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

修改

这个问题与我正在研究的一个想法有关,这个想法在R& D阶段比任何事情都要多。有问题的应用程序接受specifications并将它们传递给存储库,然后存储库使用实体框架将它们(使用它们的lambdas)转换为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查询。

1 个答案:

答案 0 :(得分:1)

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

但您可以实施Interpreter pattern