代码之家  ›  专栏  ›  技术社区  ›  Adrian Grigore

通过WCF数据服务公开LinqToSQL业务层

  •  2
  • Adrian Grigore  · 技术社区  · 14 年前

    1. 我的业务对象的某些属性是隐藏的。

    2. 数据服务可以处理相对较大的数据库(数以万计的业务实体)

    3. 我不需要几个星期就能实现数据服务

    以下是我迄今为止尝试过的方法:

    第一种方法:基于反射的提供者实现IUpdateable,业务对象实现定义良好的接口

    public interface ICustomer{
       int ID{get;set;}
       string Name{get;set;}
    }
    
    
    //My Linq entity 
    public partial class Customer: ICustomer{
       public int ID{get;set;}
       public string Name{get;set;}
       public string SomeOtherPropertyIDoNotWantToExpose{get;set;}
    }
    

    public IQueryable<ICustomer> Customers    {
          get { 
            //Note that the method below returns an IQueryable<Customer>
            return MyBusinessLayerCustomersProvider.LoadAllCustomers();
          }
        }
    

    类型上没有泛型方法“OrderBy”System.Linq.Queryable可查询'与提供的类型参数和参数兼容。如果方法是非泛型的,则不应提供类型参数。

    我不知道为什么会这样,但我被困在这一点上。

    第二种方法:基于反射的提供者围绕现有实体实现IUpdateable包装类

      //My Linq entity 
      public partial class Customer 
      {
        public int ID { get; set; }
        public string Name { get; set; }
        public string SomeOtherPropertyIDoNotWantToExpose { get; set; }
      }
    
      //the wrapper
      public partial class WrappedCustomer
      {
        internal Customer _wrappedEntity;
        public int ID { get{ return _wrappedEntity.ID;} set{ _wrappedEntity.ID = value;} }
        public string Name { get { return _wrappedEntity.Name; } set { _wrappedEntity.Name = value; } }
      }
    

    这种方法的问题是,除非我将数据库中的所有客户实体与数据服务的每个请求一起加载到内存中,否则它不会工作。这是因为数据服务提供商上的Customers属性看起来像:

    public IQueryable<Customer> WrappedCustomer
    {
      get
      {
        IQueryable<WrappedCustomer> customers = from c in MyBusinessLayerCustomersProvider.LoadAllCustomers
                     select new WrappedCustomer{_wrappedEntity = c};
    
        //I am casting to list to avoid "no supported translation to sql" errors. 
        return tasks.ToList().AsQueryable();
      }
    }
    

    第三种方法:直接公开LinqToSQL实体,使用IgnoreProperties属性

    第四种方法:实现一个定制的数据服务提供者

    似乎定制数据服务提供商可以轻松满足我的所有需求。现在可能只有我,但这看起来太复杂了。似乎我必须实现IDataServiceMetadataProvider、IDataServiceQueryProvider、IDataServiceUpdateProvider和IServiceProvider,这些都不是很简单的。即使在阅读之后 Alex J's article series

    仅仅实现IUpdateable似乎要复杂得多,特别是因为我不知道示例中提供的哪些代码部分可以简单地复制和粘贴,或者需要定制。

    第五种方法:使用EF并找到一些方法使业务层同时使用linqtosql和EF

    那么,我忽略了什么?我下一步该怎么办?我的时间不多了,所以任何建议都将不胜感激。

    谢谢,

    阿德里安

    1 回复  |  直到 14 年前
        1
  •  1
  •   Adrian Grigore    14 年前

    似乎满足我所有需求的唯一方法就是实现一个定制的数据服务提供者( see this thread