2013-12-16 145 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);