Microsoft MVP성태의 닷넷 이야기
Linq Entites 에서 string[]에 담긴 데이터를 제외하는 방법 문의 [링크 복사], [링크+제목 복사],
조회: 10563
글쓴 사람
권용완 (yongwan.kwon at koroi.com)
홈페이지
첨부 파일
 

안녕하세요.
어제 구구절절 질문/답변에 글 올렸다가 삭제후 내용정리 하여 다시 올립니다. ㅠㅠ
회사 업무프로그램을 독학으로 개발하려고 하니 어려움이 있어 도움을 청하고자 합니다.

원하는 데이터는 IsFinalOrder = true 인 데이터의 같은 QuoteNumber 값을 같는 데이터를 제거 하고자 합니다.
필터링(제외) 해야할 데이터를 Tolist()로 담았다가 다시 ToArray() 배열 string[] filter 변수에 담았습니다.

query 변수에 람다식의 Where문으로 filter 배열에 담긴 내용을 제거 하고자 합니다.

제가 얻고자 하는 데이터는 아래와 같습니다.


내연기관자동차부품 로봇자동화 KR22-002 1 1500000 False
내연기관자동차부품 로봇자동화 KR22-002 2 1400000 False
내연기관자동차부품 로봇자동화 KR22-002 3 1300000 False
내연기관자동차부품 로봇자동화 KR22-002 4 1250000 False
밧데리부품 로봇자동화 KR22-003 1 1000000 False

위와 같이 데이터를 뽑아야 하는데..잘 되지 않네요. 조언 부탁드립니다.



-------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LinqDemo2
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var customer = new List<Customer>
            {
                new Customer{ID = 1, BusinessName = "JS전자", CEOName = "유재석"},
                new Customer{ID = 2, BusinessName = "HD전자", CEOName = "강호동"},
                new Customer{ID = 3, BusinessName = "SG전자", CEOName = "이수근"},
            };
            var quotationName = new List<QuotationName>
            {
                new QuotationName{ID = 1, QuoteName = "전기자동차부품 로봇자동화" ,QuoteNumber = "KR22-001", CustomerID = 1},
                new QuotationName{ID = 2, QuoteName = "내연기관자동차부품 로봇자동화" ,QuoteNumber = "KR22-002", CustomerID = 2},
                new QuotationName{ID = 3, QuoteName = "밧데리부품 로봇자동화" ,QuoteNumber = "KR22-003", CustomerID = 2},
                new QuotationName{ID = 4, QuoteName = "밧데리부품 로봇자동화" ,QuoteNumber = "KR22-004", CustomerID = 3},
            };
            var quotationInformation = new List<QuotationInformation>
            {
                new QuotationInformation{ID = 1, QuoteGradation = 1, QuoteAmount = 1_200_000, IsFinalOrder = false, QuotationNameID = 1},
                new QuotationInformation{ID = 2, QuoteGradation = 2, QuoteAmount = 1_000_000, IsFinalOrder = true, QuotationNameID = 1},
                new QuotationInformation{ID = 3, QuoteGradation = 1, QuoteAmount = 1_500_000, IsFinalOrder = false, QuotationNameID = 2},
                new QuotationInformation{ID = 4, QuoteGradation = 2, QuoteAmount = 1_400_000, IsFinalOrder = false, QuotationNameID = 2},
                new QuotationInformation{ID = 5, QuoteGradation = 3, QuoteAmount = 1_300_000, IsFinalOrder = false, QuotationNameID = 2},
                new QuotationInformation{ID = 6, QuoteGradation = 4, QuoteAmount = 1_250_000, IsFinalOrder = false, QuotationNameID = 2},
                new QuotationInformation{ID = 7, QuoteGradation = 1, QuoteAmount = 1_000_000, IsFinalOrder = false, QuotationNameID = 3},
                new QuotationInformation{ID = 8, QuoteGradation = 1, QuoteAmount = 900_000, IsFinalOrder = true, QuotationNameID = 4},
            };

            // IsFinalOrder 값이 True인 QuoteNumber ( 제외할 데이터 )
            var filter = quotationInformation.Join(quotationName, i => i.QuotationNameID, n => n.ID, (i, n) => new { i, n })
                                            .Where(x => x.i.IsFinalOrder == true)
                                            .Distinct()
                                            .Select(d => d.n.QuoteNumber)
                                            .ToArray();
            foreach (var data in filter)
            {
                Console.WriteLine($"{data}");
            }
            Console.WriteLine("---------------------------------------------");

            // 데이터 조인
            var query = quotationInformation.Join(quotationName, i => i.QuotationNameID, n => n.ID, (i, n) => new { i, n })
                                            .Join(customer, n => n.n.CustomerID, c => c.ID, (nn, c) => new { nn, c })
                                            //.Where(x => x.nn.n.QuoteNumber.Any(s => queryQuoteNumberTrue.Contains(s.ToString())))
                                            //.Where(fi => fi.nn.n.QuoteNumber == queryQuoteNumberTrue.Contains(fi.ToString()))
                                            //.Where(fi => fi.nn.n.QuoteNumber.Select(fi=>fi.)
                                            //.Where(fi => !fi.nn.n.QuoteNumber.Any(f => fi.nn.n.QuoteNumber.Contains(filter[0])))
                                            //.Where(fi=>fi.nn.n.QuoteNumber.Any()))
                                            //.Where(fi=> filter.Except(y=>fi.nn.n.QuoteNumber.Contains(y)))
                                            .Select(q => new QuotationOrderDTO
                                            {
                                                QuoteName = q.nn.n.QuoteName,
                                                QuoteNumber = q.nn.n.QuoteNumber,
                                                QuoteGradation = q.nn.i.QuoteGradation,
                                                QuoteAmount = q.nn.i.QuoteAmount,
                                                IsFinalOrder = q.nn.i.IsFinalOrder
                                            })
                                            .ToList();

            foreach (var data in query)
            {
                Console.WriteLine($"{data.QuoteName} {data.QuoteNumber} {data.QuoteGradation} {data.QuoteAmount} {data.IsFinalOrder}");
            }
            Console.WriteLine("---------------------------------------------");
        }
    }

    public class Customer
    {
        public int ID { get; set; }
        public string BusinessName { get; set; }
        public string CEOName { get; set; }
        public List<QuotationName> QuotationNames { get; set; }
    }

    public class QuotationName
    {
        public int ID { get; set; }
        public string QuoteName { get; set; }
        public string QuoteNumber { get; set; }
        public int CustomerID { get; set; }
        public Customer Customer { get; set; }

        public List<QuotationInformation> QuotationInformation { get; set; }
    }

    public class QuotationInformation
    {
        public int ID { get; set; }
        public int QuoteGradation { get; set; }
        public decimal QuoteAmount { get; set; }
        public bool IsFinalOrder { get; set; }
        public int QuotationNameID { get; set; }
        public QuotationName QuotationName { get; set; }
    }

    public class QuotationOrderDTO
    {
        public string Customer { get; set; }
        public string QuoteName { get; set; }
        public string QuoteNumber { get; set; }
        public int QuoteGradation { get; set; }
        public decimal QuoteAmount { get; set; }
        public bool IsFinalOrder { get; set; }
    }
}








[최초 등록일: ]
[최종 수정일: 7/5/2022]


비밀번호

댓글 작성자
 



2022-07-05 08시33분
Join을 할 때 "KR22-001", "KR22-004" 데이터만을 제외하려고 해서 더 어려워진 것입니다.

우선, IsFinalOrder == true인 것을 찾아내고,

                var excludeOrder = from qi in quotationInformation
                             where qi.IsFinalOrder == true
                             select qi;

이것을 이용해 "KR22-001", "KR22-004" 레코드를 찾아내셨죠?

                var excludeName = from qi in excludeOrder
                                  join qn in quotationName on qi.QuotationNameID equals qn.ID
                                  select qn;

여기까지는 잘 하셨는데요, 문제는 이후에 바라보는 관점을 어렵게 잡았습니다. 애당초 Join 하려는 quotationName에서 "KR22-001", "KR22-004"를 제거한 집합을 구성하고 그것을 대상으로 Join을 시키는 것이 낫습니다. 따라서, 다음과 같이 제외시키면,

                var filteredName = quotationName.Except(excludeName);

이제 그냥 편안하게 Join만 시켜주면 끝입니다.

                var finalQuery = from qi in quotationInformation
                                 join qn in filteredName on qi.QuotationNameID equals qn.ID
                                 join cu in customer on qn.CustomerID equals cu.ID
                                 select new
                                 {
                                     qn.QuoteName,
                                     qn.QuoteNumber,
                                     qi.QuoteGradation,
                                     qi.QuoteAmount,
                                     qi.IsFinalOrder
                                 };

// 출력 결과
내연기관자동차부품 로봇자동화 KR22-002 1 1500000 False
내연기관자동차부품 로봇자동화 KR22-002 2 1400000 False
내연기관자동차부품 로봇자동화 KR22-002 3 1300000 False
내연기관자동차부품 로봇자동화 KR22-002 4 1250000 False
밧데리부품 로봇자동화 KR22-003 1 1000000 False
정성태
2022-07-06 10시20분
[권용완] 제가 너무 어렵게 생각했군요.
true인 "KR22-001" , "KR22-004" 레코드를 찾아서 Except하고 그것을 조인 하면 되네요...감사합니다.
[guest]
2022-07-06 11시16분
[권용완] 다른 방법으로 해봤습니다.
quotationInformation 리스트에는 QuotationNameID도 포함 하고 있으니 IsFinalOrder = true 인 QuotationNameID를 가져와서 배열저장하고
quotationInformation.Where(i => !excludeID.Any(x => x == i.QuotationNameID)) Where절에 Any()메서드를 포함했습니다.

그런다음 조인을 하니 제가 원하는 데이터가 나왔네요.
----------------------------------------------------
            // IsFinalOrder == true 인 QuotationNameID 값 찾기
            var excludeID = quotationInformation.Where(i => i.IsFinalOrder == true)
                                                .Select(s => s.QuotationNameID)
                                                .ToArray();

            foreach (var data in excludeID)
            {
                Console.WriteLine($"{data}");
            }
            Console.WriteLine("---------------------------------------------");


            var query = quotationInformation.Where(i => !excludeID.Any(x => x == i.QuotationNameID))
                                         .Join(quotationName, i => i.QuotationNameID, n => n.ID, (i, n) => new { i, n })
                                         .Join(customer, nn => nn.n.CustomerID, c => c.ID, (nn, c) => new { nn, c })
                                         .Select(s => new QuotationOrderDTO
                                         {
                                             Customer = s.c.BusinessName,
                                             QuoteName = s.nn.n.QuoteName,
                                             QuoteNumber = s.nn.n.QuoteNumber,
                                             QuoteGradation = s.nn.i.QuoteGradation,
                                             QuoteAmount = s.nn.i.QuoteAmount,
                                             IsFinalOrder = s.nn.i.IsFinalOrder,
                                         }).ToList();

            foreach (var data in query)
            {
                Console.WriteLine($"{data.QuoteName} {data.QuoteNumber} {data.QuoteGradation} {data.QuoteAmount} {data.IsFinalOrder}");
            }
            Console.WriteLine("---------------------------------------------");


조언 덕분에 한번더 알아 갑니다. 감사합니다.
[guest]

... 61  62  63  64  65  66  67  [68]  69  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
888김재영7/5/201014368TFS에 반드시! SQL Report랑 SharePoint(or WSS)가 붙어야 합니까? [2]
887임동찬7/2/201015690WCF sendTimeout에 관하여... [1]
886김재영6/16/201015698스레드 선언시 (Parameterized/)ThreadStart에 정의되는 메소드의 위치에 질문이 있습니다. [3]
885장근배6/13/201023102Win32Exception 창 핸들 에러 [1]
883채동민6/10/201015287비동기 DB 쿼리관련 질문
884정성태6/10/201016742    답변글 [답변]: 비동기 DB 쿼리관련 질문
881최준영5/24/201016516load되지않은 아이템 load하는 방법? [1]
880임상일5/10/201018612VS2010 TestManager를 통한 UI Test 관련 질문입니다. [2]파일 다운로드1
879정용훈5/3/201019851wcf 인증 문제 [2]
878채동민4/20/201019051WCF에서 maxItemsInObjectGraph 오류 관련 질문드립니다. [2]
872날쌘돌이4/8/201021751Windows7 에서 IIS에서 폼인증 으로 디버깅.. [1]파일 다운로드1
871영초4/7/201017109실버라이트로 스캐너 구동 프로그램이 가능할까요? [1]
869김재영4/6/201015995이미 실행된 어셈블리 컨트롤 권한을 다른 어셈블리에서 가져올 수 있습니까? [2]
868Lime3/5/201019596WCF 에서의 DataTable 사용 [2]
867Dani...2/18/201019729Question - HTTP 401.3 on DELETE, PUT verbs [6]파일 다운로드1
865박근대2/16/201016209WCF 오류 문의. [1]
863날쌘돌이1/31/201018551ActiveX Cab에서 닷넷 dll 등록 [1]
862장근배1/28/201016326AppPolId를 알 수 있는 방법이 있는지요? [1]
864장근배2/1/201015986    답변글 [답변]: AppPolId를 알 수 있는 방법이 있는지요?
858생초보1/26/201016355안녕하세요.. 파일 생성 처리 문제로 .... [2]
857꼭지1/22/201022097How to support Basic + Windows authentication mode in WCF(RESTful service) [4]파일 다운로드2
856질의자1/13/201020053vcredist_x86 배포 관련 여쭙습니다. [1]
855임동찬1/13/201018152이벤트 핸들러와 쓰레드의 관계 2 [4]파일 다운로드2
854임동찬1/12/201018442이벤트 핸들러와 쓰레드의 관계 [1]
853장근배1/12/201018042압축 프로그램,, [1]
852임동찬1/6/201015428base.OnStart(agrs) [1]
... 61  62  63  64  65  66  67  [68]  69  70  71  72  73  74  75  ...