动态 Entity Framework 查询[勿用]

经过测试,此方法之所以可用,因为它用的是 IEnumerable 的扩展方法

它的是先把查询号的数据放到内存后再进行筛选的,所以性能极低,差好几个数量级~

 

所以,一般情况下,就不要用这个方法了

 

====================设想======================

首先说一下我想实现什么:

Entity Framework 可以说是一个很强大的DAL

但是BLL中很多方法是可以复用和共用的

比如:得到分页列表

 

有人会说Linq to Entity(以下简称Linq)中有分页功能~

但我更想把它做成一个函数,比如 Article.GetPage(1);  <==得到文章的第一页

而且这个函数还要共用,许多Model都需要用到这个函数

 

所以如何把常用方法写成一个函数?然后让符合条件的Model调用呢?

 

在T-SQL时代,这个很好解决,因为是拼接字符串,再加上c# 2.0中强大的泛型,可以很方便的实现以上功能(我已有一个成品,并应用在了一个项目中)

 

但是在Entity Framework中怎么用?

Entity Framework中的查询不再是简单的字符串拼接了(其实所谓简单的字符串拼接反而带来了很多麻烦)

 

所以如何实现?

 

 

 

 

======================尝试========================

我先想到套用我原来的模式,利用泛型,但是却遇到了问题,详细的可以看一下博文

传送门:http://space.cnblogs.com/question/12490/

 

有人给了我很好的回答,但是没有解决问题,但就在刚才,一次偶然的尝试,再加上那个回答,我想到了解决方案

 

 

 

 

 

===================小试牛刀=========================

 

    class Program
    {
        static void Main(string[] args)
        {
            LegalAidEntities _db = new LegalAidEntities();

            test<IUser>(_db.User);

            Console.Read();
        }

        static public void test<T>(IEnumerable<T> e)
        {
            PropertyInfo pro = typeof(T).GetProperty("id");
            var q = from IUser t in e
                    where t.id==1
                    select t;
            Console.Write(q.ToList().Count);
        }

    }

    public interface IUser
    {
        int id { get; set; }
    }

 

 

以上是一个演示,关键点:
1、自定义Model属性接口,并在 Model1.Designer.cs 中继承这个接口
2、函数传入的参数是 IEnumerable<T>
这样就可以实现动态的Linq查询了~
大致原理呢,就是 Queryable<T> 中的 Where 和 IEnumerable<T> 扩展方法 Where 的执行方式不同,所以可以
具体的没有源码,也不知道具体的原理了
posted @ 2010-03-12 05:31  Dozer  阅读(1489)  评论(0编辑  收藏  举报