OR 연산에 아래의 방법을 사용할 때 중복 레코드가 반환됩니다. 사용자 지정 IEqualityComparer를 지정해야합니까?() 간단한 구별이어떻게해야합니까 다음과 같은 linq 일반 메서드는 고유 레코드를 반환합니까?
internal static IQueryable<T> FilterEntity<T>(filters filters, IQueryable<T> entities)
{
if (filters.groupOp == "AND")
foreach (var rule in filters.rules)
entities = entities.Where<T>(
rule.field, rule.data,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation), rule.op)
);
else
{
//Or
IQueryable<T> temp = (new List<T>()).AsQueryable();
foreach (var rule in filters.rules)
{
var t = entities.Where<T>(
rule.field, rule.data,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation), rule.op)
);
temp = temp.Concat<T>(t).AsQueryable();
}
entities = temp;
}
return entities;
}
아래 @usr FROM SUGGESTION 편집 된 후 작동하지 않습니다 -이 나에게 (별개의)와 SQL 프로파일 러에서 올바른 쿼리를 제공하지만 너무 복잡한보고 시작 - 나는 청소기처럼 WD 용액
internal static IQueryable<T> FilterEntity<T>(filters filters, IQueryable<T> entities)
{
if (filters.groupOp == "AND")
foreach (var rule in filters.rules)
entities = entities.Where<T>(
rule.field, rule.data,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation), rule.op)
);
else
{
//Or
var t1 = entities.Where<T>(filters.rules[0].field,filters.rules[0].data,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation),filters.rules[0].op)
);
for (int i = 1; i<filters.rules.Count(); i++)
{
var t = t1.Where<T>(filters.rules[i].field, filters.rules[i].data,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation), filters.rules[i].op)
);
t1.Concat<T>(t).AsQueryable();
}
entities = t1;
}
return entities.Distinct<T>();
}
거의 모든 LINQ 공급자에서 "새 목록()"을 LINQ 쿼리와 함께 사용할 수 없습니다. 이 코드는 원하는대로 작동하지 않습니다 (제대로 실행되지만). 데이터베이스를 너무 자주 호출하고 있습니다. 그것은 진짜 질문이 아닙니다. –
usr
내가 사용하는 각 규칙에 대해 하나의 쿼리를 생성합니다. 뚜렷한 일을하지 말라. 그것은 내가 원하는 것을하고 있습니다. 여러 동적 검색을 구현하는 더 좋은 방법이 있습니까? - 그것으로 전환하게되어 기쁩니다 –
목록 대신 List가있는 각 엔티티에 대해 별도의 필터 클래스를 작성하면 동일한 문제가 발생합니다. –