동적 Linq 라이브러리를 사용하여 동적 검색 표현식을 작성하고 있습니다. 일대 다 관계가있는 탐색 속성에 대해 동적 linq 라이브러리를 사용하여 람바 식을 구성하는 방법에 대한 문제가 발생했습니다.
다음과 같이 contains 문과 함께 사용하고 있습니다.
Person.Names.Select(FamilyName).FirstOrDefault()
작동하지만 두 가지 문제가 있습니다.
물론 FirstOrDefault () 이름 만 선택합니다. 우리는 각 사람의 모든 이름을 사용하기를 원합니다.
개인의 이름이 없으면 Select에서 예외가 발생합니다.
두 개의 from 문을 수행 할 수 있기 때문에 일반 쿼리로는 그렇게 어렵지 않지만 람다 식은 더 어렵습니다.
모든 권장 사항을 부탁드립니다.
편집-추가 코드 정보 ... 동적이 아닌 linq 표현식은 다음과 같습니다.
var results = persons.Where(p => p.Names.Select(n => n.FamilyName).FirstOrDefault().Contains("Smith")).ToList();
수업은 다음과 같습니다.
public class Person
{
public bool IsActive { get; set;}
public virtual ICollection<Name> Names {get; set;}
}
public class Name
{
public string GivenName { get; set; }
public string FamilyName { get; set; }
public virtual Person Person { get; set;}
}
우리는 그것을 해시하고 만들었지 만 꽤 도전적이었습니다. 다음은 최종 결과로 진행하는 방법에 대한 다양한 방법입니다. 이제 SearchExpression 클래스가 어떻게 만들어 졌는지 다시 생각 해봐야합니다. 그러나 그것은 또 다른 이야기입니다.
1. 동등한 쿼리 구문
var results = from person in persons
from name in person.names
where name.FamilyName.Contains("Smith")
select person;
2. 동등한 Lambda 구문
var results = persons.SelectMany(person => person.Names)
.Where(name => name.FamilyName.Contains("Smith"))
.Select(personName => personName.Person);
3. 동적 Linq와 동등한 Lambda 구문
var results = persons.AsQueryable().SelectMany("Names")
.Where("FamilyName.Contains(@0)", "Smith")
.Select("Person");
참고 -Dynamic Linq 라이브러리에 Contains 메소드를 추가해야합니다.
편집-또는 select를 사용하십시오 ... 훨씬 더 간단하지만 위에서 언급 한 것처럼 Contains 메소드를 추가해야합니다.
var results = persons.AsQueryable().Where("Names.Select(FamilyName)
.Contains(@0", "Smith)
우리는 원래 이것을 시도했지만 '적용 가능한 집계 방법이 없습니다.'라는 공포에 부딪쳤다. 오류. SelectMany를 작동 시키려고 할 때 문제를 해결 한 방법에 대해 살펴 보았습니다. 따라서 Select 메서드로 돌아갔습니다.