Development Tip

Linq의 여러 WHERE 절

yourdevel 2020. 10. 28. 21:09
반응형

Linq의 여러 WHERE 절


LINQ를 처음 사용하고 여러 where 절을 실행하는 방법을 알고 싶습니다. 이것이 내가 원하는 것입니다. 특정 사용자 이름을 필터링하여 레코드를 반환합니다. 아래 코드를 시도했지만 예상대로 작동하지 않습니다.

DataTable tempData = (DataTable)grdUsageRecords.DataSource;
var query = from r in tempData.AsEnumerable()
            where ((r.Field<string>("UserName") != "XXXX") || (r.Field<string>("UserName") != "XXXX"))                            
            select r;    

            DataTable newDT = query.CopyToDataTable();

미리 도와 주셔서 감사합니다 !!!


글쎄, 당신은 여러 "where"절을 직접 넣을 수 있지만, 나는 당신이 원하지 않는다고 생각합니다. 여러 "where"절은 제한적인 필터로 끝납니다 . 제한 적인 필터를 원한다고 생각합니다 . 나는 당신이 정말로 원한다고 생각합니다.

DataTable tempData = (DataTable)grdUsageRecords.DataSource;
var query = from r in tempData.AsEnumerable()
            where r.Field<string>("UserName") != "XXXX" &&
                  r.Field<string>("UserName") != "YYYY"
            select r;

DataTable newDT = query.CopyToDataTable();

|| 대신 &&를 참고하십시오. 사용자 이름이 XXXX없는 경우 행을 선택합니다 사용자 이름이 YYYY 없습니다.

편집 : 전체 컬렉션이있는 경우 더 쉽습니다. 컬렉션이 호출되었다고 가정합니다 ignoredUserNames.

DataTable tempData = (DataTable)grdUsageRecords.DataSource;
var query = from r in tempData.AsEnumerable()
            where !ignoredUserNames.Contains(r.Field<string>("UserName"))
            select r;

DataTable newDT = query.CopyToDataTable();

이상적으로 HashSet<string>Contains통화 시간이 오래 걸리는 것을 피하기 위해 이것을 a로 만들고 싶지만 컬렉션이 충분히 작 으면 많은 확률을 얻지 못할 것입니다.


@ 테오

LINQ 변환기는 다음을 실행할 수있을만큼 똑똑합니다.

.Where(r => r.UserName !="XXXX" && r.UsernName !="YYYY")

나는 LinqPad에서 이것을 테스트했습니다 ==> 예, Linq 번역기는 충분히 똑똑합니다 :))


@Jon : Jon, 예를 들어 where 절을 여러 개 사용하고 있습니까?

var query = from r in tempData.AsEnumerable()
            where r.Field<string>("UserName") != "XXXX" 
            where r.Field<string>("UserName") != "YYYY"
            select r;

사용하는 것보다 더 절제 적입니다

var query = from r in tempData.AsEnumerable()
            where r.Field<string>("UserName") != "XXXX" && r.Field<string>("UserName") != "YYYY"
            select r;

결과적으로는 동등하다고 생각합니다.

그러나 첫 번째 예제에서 두 개의 하위 쿼리에서 원인을 여러 개 사용하는 경우 즉 .Where(r=>r.UserName!="XXXX").Where(r=>r.UserName!="YYYY), LINQ 변환기가 실행하기에 충분히 똑똑한 경우 테스트하지 않았습니다..Where(r=>r.UserName!="XXXX" && r.UsernName!="YYYY")


또한 bool 메서드를 사용할 수 있습니다.

쿼리 :

DataTable tempData = (DataTable)grdUsageRecords.DataSource;
var query = from r in tempData.AsEnumerable()
            where isValid(Field<string>("UserName"))// && otherMethod() && otherMethod2()                           
            select r;   

        DataTable newDT = query.CopyToDataTable();

방법:

bool isValid(string userName)
{
    if(userName == "XXXX" || userName == "YYYY")
        return false;
    else return true;
}

참고 URL : https://stackoverflow.com/questions/679644/multiple-where-clause-in-linq

반응형