Microsoft MVP성태의 닷넷 이야기
Linq Entites 에서 string[]에 담긴 데이터를 제외하는 방법 문의 [링크 복사], [링크+제목 복사]
조회: 3872
글쓴 사람
권용완 (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]

1  2  3  [4]  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5856guest3/17/20233163Form1_FormClosing에 closing time을 Sqlite 저장하는 법? [6]파일 다운로드1
5855욜로3/17/20232761C# 메타데이터에서 불러오는 참조 정의가 안됨 [1]
5854민성3/16/20232950안녕하세요 asp.net mvc using문 관련하여 [1]
5853pa3/16/20233198오피스 2016 업데이트 후 파일 출력 불가 [1]
5852guest3/16/20232891입력 foreach 검색/출력 foreach [3]
5851guest3/15/20233225foreach내 list변경 [10]
5850독서가3/14/20232888C#에서 동적dll 사용시 문의입니다. [4]파일 다운로드1
5849guest3/9/20232874C# wpf로 Web에서 구동되는 hts가능한가요? (노트북없고 스마트폰 없음) [4]
5848민성3/9/20232783도움 요청드립니다. [2]파일 다운로드1
5847guest3/7/20232933SQlike Like 구문 - 1시간째 인데 안되네요 [13]
5846Huuu...3/7/20232620웹 다운로드에 대한 고찰 [5]파일 다운로드1
5845guest3/7/20232644C# Split함수의 불친절함 [1]
5844까망이3/7/20232762c# 무료 디컴파일러는 어떤게 좋습니까? [1]
5843guest3/7/20232723판매 후 dll 등 에러 [5]
5842kr13/6/20232765publish 할 때 분석기 관련 dll 제외 [5]
5841guest3/3/20232956프로그램 판매 시 - Upgrade 버전 판매 [2]
5840joe3/2/20233053C# 클래스 라이브러리 수정 -> C++에서 참조시 함수 목록 갱신되지 않음. [4]파일 다운로드1
5839guest3/2/20233680윈도우 서비스 프로그램 - FORM 애플리케이션 감시서비스 [8]
5838랄랄라3/1/20232889event 사용 시 두 표현의 차이점이 있을까요? [1]
5837감사합니...2/28/20233046오라클 DB서버 접속관련 문의 드립니다.(Load Balancing, HA Events) [2]
5836박지범2/27/20232839static instance의 initialize 순서가 보장되나요? [6]
5835주민호2/25/20235647Windows Software Development Kit - 최신버전 1개 남기고 다 삭제하면 안되는지요? [10]파일 다운로드1
5834guest2/24/20232886Python IDE - 비주얼스튜디오 [3]
5833무지남2/23/20232597Async 메서드 그리고 나서 Bool 메서드 [5]
5832김지우2/21/20232884event와 delegate의 차이 , event를 써야하는 이유 [1]
5831이우람2/20/20233129ref 전역변수가 pinned가 될수 있나요? [2]
1  2  3  [4]  5  6  7  8  9  10  11  12  13  14  15  ...