zoukankan      html  css  js  c++  java
  • Linq 查询 与方法调用

    通常,使用linq查询时需要一个实现IQueryable<T> 的查询对象

     public class DataA<T> : IQueryable<T> {....}
    

      

    之后通过

     var q = from c in new DataA<int>() where c > 0 select new { a = c.ToString() };
    

      进行查询,使用IQueryProvider  收集用户输入的表达式进行处理。

    但是查询本身实际上只关注查询对象上有无可用的 linqmethod(Select,Where.....).

    如下,定义一个泛型对象

    public class Data<T> {
            public Data<TResult> Select< TResult>(   Expression<Func<T, TResult>> selector) {
                return new Data<TResult>();
            }
            public Data<T> Where (  Expression<Func<T,bool>> f) {
                return this;
            }
        }
    

    只要保证Data上拥有与linq方法相同的实例方法,(Select,Where...),

    我们依然可以使用相同的 linq 语法进行查询:

    var q = from c in new Data<int>() where c > 0 select new { a = c.ToString() };
    

     结论: linq 查询语法与查询对象的类型无关,只会检查查询对象上有无名称、方法签名一致的方法(实例方法或扩展方法)。

    IQueryable,IQueryProvider 在linq查询中不是必须的。

    顺便说一下 ,个人认为, orm中最好不要使用IQueryable 这些,容易造成方法污染, 而且linq查询语法是固定的,无法扩展或限制。

    Orm中最好直接使用 各种查询方法,更加灵活一些。

       

  • 相关阅读:
    android handle详解
    android面试详解
    linux网络编程-一个简单的线程池(41)
    linux网络编程-posix条件变量(40)
    如何写一个简单的分页
    jQuery 3 有哪些新东西
    浅析正则表达式模式匹配的 String 方法
    jQuery源码浅析2–奇技淫巧
    前端文本截断
    你会用setTimeout吗
  • 原文地址:https://www.cnblogs.com/cerl/p/5812429.html
Copyright © 2011-2022 走看看