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 });
}
이제 사용자가 제공하는 경우에만 다음 필드/필터를 추가해야 합니다.
- 제품 번호 - 태그 헤더에 결합할 수 있는 다른 테이블에서 가져옵니다.
- PO 번호 - 태그 머리글 테이블 내의 필드입니다.
- 주문 번호 - PO 번호와 비슷하지만 열이 다를 뿐입니다.
- 제품 상태 - 사용자가 드롭다운에서 선택한 경우 선택한 값을 여기에 적용해야 합니다.
제가 이미 가지고 있는 쿼리는 잘 작동하고 있지만, 기능을 완성하려면 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
'programing' 카테고리의 다른 글
Wordpress Woocommerce 사용자 지정 배송 필드(AJAX)에서 값 가져오기 (0) | 2023.06.13 |
---|---|
판다의 열 순서를 _csv 방법으로 보존 (0) | 2023.06.13 |
내일 날짜를 알 수 있는 가장 깨끗하고 가장 파이썬적인 방법? (0) | 2023.06.13 |
mariadb 온라인 삭제 인덱스가 작동하지 않음 (0) | 2023.06.13 |
Oracle Text는 NVARCHAR2에서 작동하지 않습니다.그 밖에 어떤 것을 사용할 수 없습니까? (0) | 2023.06.13 |