2013-12-16 120 views
0

我有一个WCF服务库和Widnows窗体作为客户端。我有数据库ADO.NET EF 我想列出所有产品(衣服)的大小。 (关系1到很多)。WCF从WCF服务获取实体

public partial class ProductsEntity 
{ 
    public ProductsEntity() 
    { 
     this.Sizes = new HashSet<SizesEntity>(); 
    } 

    public int ID { get; set; } 
    public string Name { get; set; } 
    public decimal Price { get; set; } 

    public virtual ICollection<SizesEntity> Sizes{ get; set; } 
} 

这是我的数据合同:

[DataContract] 
public class Products 
{ 
    [DataMember] 
    public int ID { get; set; } 
    [DataMember] 
    public string Name{ get; set; } 
    [DataMember] 
    public decimal Price { get; set; } 
    [DataMember] 
    public virtual ICollection<SizesEntity> Sizes{ get; set; } 

} 

[DataContract] 
public class Sizes 
{ 

    [DataMember] 
    public int ID { get; set; } 
    [DataMember] 
    public int Name { get; set; } 
    [DataMember] 
    public Nullable<int> Quantity { get; set; } 
    [DataMember] 
    public int ID_Product { get; set; } 

    [DataMember] 
    public virtual ProductsEntity Products { get; set; } 

} 

我不以数据的基础上有这个,但我加入Products_with_sizes我的查询(林不知道它和它打交道的好方法)

[DataContract] 
public class Products_with_sizes 
{ 
    [DataMember] 
    public int ID { get; set; } 
    [DataMember] 
    public string Name { get; set; } 
    [DataMember] 
    public decimal Price { get; set; } 
    [DataMember] 
    public int S { get; set; } 
    [DataMember] 
    public int M { get; set; } 
    [DataMember] 
    public int L { get; set; } 
} 

using (var context = new dbMagazynierEntities()) 
      { 
       var q = (from p in context.Products 
          where p.Name.Contains(name) && p.Price>= Price_from && p.Price <= Price_to 
          join r in context.Sizes 
           on p.ID equals r.Prodcuts.ID 
           into sizes 
          select new 
          { 
           ID = p.ID, 
           Name= p.Name, 
           Price = p.Price, 
           S = sizes.Where(x => x.Name== 0).Sum(x => x.Quantity) ?? 0, 
           M = sizes.Where(x => x.Name== 1).Sum(x => x.Quantity) ?? 0, 
           L = sizes.Where(x => x.Name== 2).Sum(x => x.Quantity) ?? 0, 
          }); 
       odp = new List<Products_with_sizes>(); 
       foreach (var item in q) 
       { 
        odp.Add(new Products_with_sizes{ ID = item.ID, Name= item.Name, Price = item.Price, S = item.S, M = item.M, L = item.L }); 
       } 

所以知道我在客户端使用这种方法,我也得到错误

      wyn = context.SzukajProduktu(id, name.Text, price_from, price_to); 

我得到:

Cannot implicitly convert type 'System.Collections.Generic.List<Magazynier2WindowsFormsApplication.ServiceReference1.MyServiceProducts_with_sizes>' to 'System.Collections.Generic.List<Magazynier2ServiceLibrary.MyService.Products_with_sizes>' 
+0

你能给你的最后一段代码,更多的细节解决了吗? “上下文”是什么类型?显示'SzukajProduktu'方法的定义。 –

回答

1

通过看你的例外,似乎你想直接投您的服务代理生成一个类来创建自己的DTO。

尽管这两个类具有相同的名称和属性,但它们实际上是不同的(即,没有共同的父代或接口)并且位于不同的名称空间中。

您应该编写一个方法,将代理生成的类明确地转换为您的DTO类,例如,

List<Magazynier2ServiceLibrary.MyService.Products_with_sizes> TranslateProxyClassToDTO(List<Magazynier2WindowsFormsApplication.ServiceReference1.MyServiceProducts_with_sizes> input) 
{ 
    // translate all items and their properties and return the translated list 
} 
+0

我只有窗体和服务库可以吗?或者我应该在它们之间创建一个图层? – johns

+1

你不需要。重要的是翻译对象。 – Szymon

+0

翻译是否应该在客户端或服务?我应该创建类Products_with_sizes也在客户端? – johns

0
public List<Prodcuts_with_sizes> SzukajProduktu(int id, string name, decimal price_from, decimal price_to) 
    { 
     List<Prodcuts_with_sizes> odp; 
     if (id == -1) //when id is not given 
     { 
      using (var context = new dbMagazynierEntities()) 
      { 
       var q = (from p in context.Products 
          where p.Name.Contains(name) && p.Price >= price_from && p.Price <= price_to 
          join r in context.Size 
           on p.ID equals r.Products.ID 
           into sizes 
          select new 
          { 
           ID = p.ID, 
           Name = p.Name, 
           Price = p.Price, 
           S = sizes.Where(x => x.Name == 0).Sum(x => x.Quantity) ?? 0, 
           M = sizes.Where(x => x.Name == 1).Sum(x => x.Quantity) ?? 0, 
           L = sizes.Where(x => x.Name == 2).Sum(x => x.Quantity) ?? 0, 
          }); 
       odp = new List<Prodcuts_with_sizes>(); 
       foreach (var item in q) 
       { 
        odp.Add(new Prodcuts_with_sizes { ID = item.ID, Name = item.Name, Price = item.Price, S = item.S, M = item.M, L = item.L }); 
       } 
       //dataGridView1.DataSource = q.ToList(); 
      } 
      return odp; 
     } 
     else //when id is given 
     { 
      using (var context = new dbMagazynierEntities()) 
      { 
       var q = (from p in context.Products 
          where p.ID == id 
          join r in context.Sizes 
           on p.ID equals r.Products.ID 
           into sizes 
          select new 
          { 
           ID = p.ID, 
           Name = p.Name, 
           Price = p.Price, 
           S = sizes.Where(x => x.Name == 0).Sum(x => x.Quantity) ?? 0, 
           M = sizes.Where(x => x.Name == 1).Sum(x => x.Quantity) ?? 0, 
           L = sizes.Where(x => x.Name == 2).Sum(x => x.Quantity) ?? 0, 
          }); 
       odp = new List<Prodcuts_with_sizes>(); 
       foreach (var item in q) 
       { 
        odp.Add(new Prodcuts_with_sizes { ID = item.ID, Name = item.Name, Price = item.Price, S = item.S, M = item.M, L = item.L }); 
       } 
      } 
      return odp; 

     } 
    } 


using (var context = new MyInterfaceClient()) 
       { 
        wyn = context.SzukajProduktu(id, name.Text, price_from, price_to); 
        //return wyn; 
       } 
0

我改变

[OperationContract] 
    List<WCFLIB.MyService.Products_with_sizes> SzukajProduktu(int id, string name, decimal price_form, decimal price_to); 

[OperationContract] 
    List<MyService.Products_with_sizes> SzukajProduktu(int id, string name, decimal price_form, decimal price_to);