1

以下の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レコードに小さな問題があります。CustomerIdに基づいてCustomerDetailから個別のレコードを取得したいだけです。

CustomerDetailは、同じCustomerIdに対して複数のレコードを持つことができます

CustomerDetailテーブルから個別のレコードのみを取得するようにクエリをフィルタリングする方法を提案してください

ありがとう、

4

4 に答える 4

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());
于 2012-05-22T05:56:33.063 に答える
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();
于 2012-05-22T05:48:35.657 に答える
1

.ToList() Ieの前に.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();
于 2012-05-22T05:48:49.870 に答える
0

試す:

(--your code--).Distinct().ToList();
于 2012-05-22T05:52:56.983 に答える