• 封装EF,使用仓储模式所遇到的问题


    1 whereif在仓储模式下的封装问题

    直接在Repository中定义方法这样可以直接使用

    2 不同数据库的连接查询

    这个暂时没有想到(8.14更新想到的办法是把数据查询出来放到内存中,然后用join或者groupjoin来进行联合查询)

    3IEnumerable和IQueryable 区别

    简单来说就是对于所有IEnumerable的过滤、排序等操作,都发生在内存里,也就是说数据已经从数据库中获取到内存中,只是在内存中进行处理

    所有对于IQueryable的过滤,排序等操作,只有在数据真正用到的时候才会到数据库中查询。这也是Linq的延迟加载核心所在。

    IQueryable该接口会把查询表达式先缓存到表达式树Expression 中,只有当真正遍历发生的时候,才会由IQueryProvider解析表达式树,生成sql语句执行数据库查询操作。(离线集合)

    IEnumable 该接口会立即返回需要的集合。(本地集合)

    IQueryable接口是继承自IEnumerable的接口的.

    namespace System.Linq
    {
        public interface IQueryable : IEnumerable
        {
            Type ElementType { get; }
            Expression Expression { get; }
            IQueryProvider Provider { get; }
        }
    }

    4Expression<Func<T, bool>> predicate和 Func<T, bool> predicate 区别

    Func<TObject, bool>是委托(delegate)

    Expression<Func<TObject, bool>>是表达式

    Expression编译后就会变成delegate,才能运行。比如

    Expression<Func<int, bool>> ex = x=>x.id>1;

    Func<int, bool> func = ex.Compile(); 

     //
        // 摘要:
        //     Represents a strongly typed lambda expression as a data structure in the form
        //     of an expression tree. This class cannot be inherited.
        //
        // 类型参数:
        //   TDelegate:
        //     The type of the delegate that the System.Linq.Expressions.Expression`1 represents.
        public sealed class Expression<TDelegate> : LambdaExpression
        {
            public TDelegate Compile();
            
            public TDelegate Compile(bool preferInterpretation);
            
            public TDelegate Compile(DebugInfoGenerator debugInfoGenerator);
           
            public Expression<TDelegate> Update(Expression body, IEnumerable<ParameterExpression> parameters);
    protected internal override Expression Accept(ExpressionVisitor visitor); }

    从元数据可以看出,Expression是密封类,不能被继承,里面有个Compile方法,调用这个方法才能生成delegate,

  • 相关阅读:
    CSS中:display:none与visible:hidden的区别
    $(function(){})和$(document).ready(function(){}) 的用法
    JavaScript 全选函数的实现
    HTML:关于a标签的target属性
    CSS:给 input 中 type="text" 设置CSS样式
    JavaScript中“javascript:void(0) ”是什么意思
    Oracle数据库——数据库安全性管理
    使用JavaScript根据从后台获取来的数据打开一个新的页面
    java reflect反射---Java高级开发必须懂的
    Java 类加载机制
  • 原文地址:https://www.cnblogs.com/carlpeng/p/13402842.html
Copyright © 2020-2023  润新知