programing

LINQ에서 SQL로 절 지정(선택 사항) 기준

newstyles 2023. 6. 13. 22:04

LINQ에서 SQL로 절 지정(선택 사항) 기준

LINQ to SQL 쿼리로 작업 중인데 데이터 결과를 필터링할 4개의 선택적 필드가 있는 문제가 발생했습니다.즉, 값을 입력할지 여부를 선택할 수 있습니다.특히, 값이 있거나 빈 문자열이 있는 몇 개의 텍스트 상자와 값이 선택되었거나 선택되지 않은 몇 개의 드롭다운 목록...

예:

    using (TagsModelDataContext db = new TagsModelDataContext())
     {
        var query = from tags in db.TagsHeaders
                    where tags.CST.Equals(this.SelectedCust.CustCode.ToUpper()) 
                    && Utility.GetDate(DateTime.Parse(this.txtOrderDateFrom.Text)) <= tags.ORDDTE
                    && Utility.GetDate(DateTime.Parse(this.txtOrderDateTo.Text)) >= tags.ORDDTE
                    select tags;
        this.Results = query.ToADOTable(rec => new object[] { query });
    }

이제 사용자가 제공하는 경우에만 다음 필드/필터를 추가해야 합니다.

  1. 제품 번호 - 태그 헤더에 결합할 수 있는 다른 테이블에서 가져옵니다.
  2. PO 번호 - 태그 머리글 테이블 내의 필드입니다.
  3. 주문 번호 - PO 번호와 비슷하지만 열이 다를 뿐입니다.
  4. 제품 상태 - 사용자가 드롭다운에서 선택한 경우 선택한 값을 여기에 적용해야 합니다.

제가 이미 가지고 있는 쿼리는 잘 작동하고 있지만, 기능을 완성하려면 where 절에 이 4개의 다른 항목을 추가할 수 있어야 합니다. 방법을 모르겠습니다!

원래 쿼리를 코딩할 수 있습니다.

var query = from tags in db.TagsHeaders
                where tags.CST.Equals(this.SelectedCust.CustCode.ToUpper()) 
                && Utility.GetDate(DateTime.Parse(this.txtOrderDateFrom.Text)) <= tags.ORDDTE
                && Utility.GetDate(DateTime.Parse(this.txtOrderDateTo.Text)) >= tags.ORDDTE
                select tags;

그런 다음 조건에 따라 추가적인 장소 제약 조건을 추가합니다.

if(condition)
    query = query.Where(i => i.PONumber == "ABC"); 

쿼리 구문으로 코드화하는 방법은 잘 모르겠지만 id는 람다와 함께 작동합니다.또한 초기 쿼리에 대한 쿼리 구문과 보조 필터에 대한 람다와도 작동합니다.

얼마 전에 코딩한 확장 메서드(아래)를 포함하여 조건부 where 문을 포함할 수도 있습니다. (쿼리 구문에서는 잘 작동하지 않습니다.)

        var query = db.TagsHeaders
            .Where(tags => tags.CST.Equals(this.SelectedCust.CustCode.ToUpper()))
            .Where(tags => Utility.GetDate(DateTime.Parse(this.txtOrderDateFrom.Text)) <= tags.ORDDTE)
            .Where(tags => Utility.GetDate(DateTime.Parse(this.txtOrderDateTo.Text)) >= tags.ORDDTE)
            .WhereIf(condition1, tags => tags.PONumber == "ABC")
            .WhereIf(condition2, tags => tags.XYZ > 123);

확장 방법:

public static IQueryable<TSource> WhereIf<TSource>(
    this IQueryable<TSource> source, bool condition,
    Expression<Func<TSource, bool>> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}

다음은 IEnumerables에 대한 동일한 확장 방법입니다.

public static IEnumerable<TSource> WhereIf<TSource>(
    this IEnumerable<TSource> source, bool condition,
    Func<TSource, bool> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}

매개 변수의 존재에 대한 조건부 검사만 사용하면 됩니다.예를 들어:

where (string.IsNullOrEmpty(ProductNumber) || ProductNumber == tags.productNumber)

이렇게 하면 제품 번호를 입력하지 않으면 모든 경우에 true가 반환되지만 입력한 경우 일치할 때만 true가 반환됩니다.

||로 OR을 할 수 있는 능력이 있습니다.

좋은 포인터를 제공할 수 있으니 이 스레드를 확인하십시오. C# LINQ는 다소 복잡한 SQL 쿼리와 동일합니다.

언급URL : https://stackoverflow.com/questions/632434/linq-to-sql-where-clause-optional-criteria