2012-05-22 37 views
1

不同的值我用下面的LINQ查詢加入一些表來得到準確的數據..如何讓LINQ

(from row in 
    (from c in DbContext.Customer 
    join cd in DbContext.CustomerDetails 
    on c.Customer_Id equals cd.CustomerDetail_CustomerId 
    join cp in DbContext.ProductPurchases 
    on cd.CustomerDetail_OrgID equals cp.ProductPurchase_OrgID 
    where cd.CustomerDetail_OrgId == OrganizationID --organization Id is common 
    && c.Customer_Org_Id == OrganizationID 
    && cp.ProductPurchase_OrgID == OrganizationID 
    orderby cd.CustomerDetail_CreatedDate descending 
    select new { c, cd, cp }) 
    select new CustomerDTO 
    { 
     CustomerId = row.cpd.CustomerDetail_CustomerID, 
     CustomerName = row.c.Customer_LastName+", "+row.c.Customer_FirstName, 
    }).ToList(); 

我在爲CustomerDetail記錄一個小問題,我只是想從不同的記錄基於在客戶爲CustomerDetail ....

爲CustomerDetail可以有一個以上的記錄同一客戶編號

請建議如何我過濾查詢從爲CustomerDetail表只得到重複的記錄

謝謝,

回答

2

LINQ提供了Distinct方法。但是,它默認使用默認的相等比較器,或者使用您指定的選項。

我會推薦使用匿名類型,而不是使用屬性CustomerId和CustomerName定義一個類,然後覆蓋Equals。

public class DistinctCustomer 
{ 
    public int CustomerId { get; set; } 
    public string CustomerName { get; set; } 

    public override bool Equals(object obj) 
    { 
     if (ReferenceEquals(obj, null)) return false; 
     if (ReferenceEquals(this, obj)) return true; 

     var other = obj as DistinctCustomer; 

     if (other == null) return false; 

     return CustomerId == other.CustomerId; 
    } 

    public override int GetHashCode() 
    { 
     return CustomerId.GetHashCode(); 
    } 
} 

然後

(from row in 
    (from c in DbContext.Customer 
    join cd in DbContext.CustomerDetails 
    on c.Customer_Id equals cd.CustomerDetail_CustomerId 
    join cp in DbContext.ProductPurchases 
    on cd.CustomerDetail_OrgID equals cp.ProductPurchase_OrgID 
    where cd.CustomerDetail_OrgId == OrganizationID --organization Id is common 
    && c.Customer_Org_Id == OrganizationID 
    && cp.ProductPurchase_OrgID == OrganizationID 
    orderby cd.CustomerDetail_CreatedDate descending 
    select new { c, cd, cp }) 
    select new DistinctCustomer 
    { 
     CustomerId = row.cpd.CustomerDetail_CustomerID, 
     CustomerName = row.c.Customer_LastName+", "+row.c.Customer_FirstName, 
    }).Distinct().ToList(); 
+0

真,這將是隻需要如果同一客戶ID,有一個以上的姓氏/名字。否則,匿名類型就足以確保所有屬性都相等 –

+0

對,並且他特別聲明瞭他希望僅在CustomerId – HackedByChinese

+0

上檢查截然不同。感謝您的評論我已經定義了一個具有您提及的屬性的類... ..it CustomerDTO – aamankhaan

1

.ToList() 即只要使用.Distinct()

(from row in 
  (from c in DbContext.Customer 
   join cd in DbContext.CustomerDetails 
   on c.Customer_Id equals cd.CustomerDetail_CustomerId 
   join cp in DbContext.ProductPurchases 
   on cd.CustomerDetail_OrgID equals cp.ProductPurchase_OrgID 
   where cd.CustomerDetail_OrgId == OrganizationID --organization Id is common 
   && c.Customer_Org_Id == OrganizationID 
   && cp.ProductPurchase_OrgID == OrganizationID 
   orderby cd.CustomerDetail_CreatedDate descending 
   select new { c, cd, cp }) 
   select new 
   { 
      CustomerId = row.cpd.CustomerDetail_CustomerID, 
      CustomerName = row.c.Customer_LastName+", "+row.c.Customer_FirstName, 
   }).Distinct().ToList(); 
+0

這將找到不同的對象,而不是由特定的字段。 –

+0

hello @RJLohan我已經根據上面指定的答案作出了更改,但仍然是同樣的問題....它沒有采取不同的值 – aamankhaan

0

嘗試:

(--your code--).Distinct().ToList(); 
+0

ToLost - >好像錯字 – Tilak

+0

感謝您的幫助。 –

5

您可以實現一個比較器類爲您爲CustomerDetail(S)-Objects,然後使用重載的版本,接受您的比較器。

事情是這樣的:

class CustomerDetailsComparer: IEqualityComparer<CustomerDetail> 
{ 
    public bool Equals(CustomerDetail x, CustomerDetail y) 
    { 

     if (Object.ReferenceEquals(x, y)) return true; 

     if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) 
      return false; 

     return x.CustomerId == y.CustomerId; 
    } 


    public int GetHashCode(CustomerDetail cd) 
    { 
     // Do something here 
    } 
} 


// ... 

DbContext.CustomerDetails.Distinct(new CustomerDetailsComparer());