그래서 입력이있을 때 컨트롤러에 값을 전달하는 검색 입력과 확인란이 있습니다. 그리고이 값을 사용하여 데이터베이스에서 무언가를 되찾고 싶습니다. 검색 입력은 문자열이며 작동하고 의도합니다. 검색 입력 코드는 다음과 같습니다.
public async Task<ViewResult> Index(string searchString, List<int> checkedTypes)
{
var products = from p in _db.Products select p;
ViewData["CurrentFilter"] = searchString;
if (!string.IsNullOrEmpty(searchString))
{
products = products.Where(p => p.Name.ToLower().Contains(searchString));
}
return View(products);
}
그러나 확인란 값은 목록에 저장됩니다. 그래서 기본적으로 위의 코드와 동일하지만 목록을 사용하고 싶습니다. 따라서 기본적으로 아이디어는 다음과 같습니다.
if(checkedTypes != null)
{
foreach (var i in checkedTypes)
{
products = products.Where(p => p.TypeId == i));
}
}
위의 코드처럼 수행하면 루프에서 마지막 (i)를 얻습니다. 내가 한 또 다른 해결책은 다음과 같습니다.
if(checkedTypes != null)
{
var temp = new List<Product>();
foreach (var i in checkedTypes)
{
temp.AddRange(products.Where(p => p.TypeId == i));
}
products = temp.AsQueryable();
}
하지만 그렇게했을 때이 오류가 발생합니다.
InvalidOperationException : 소스 IQueryable의 공급자가 IAsyncQueryProvider를 구현하지 않습니다. IAsyncQueryProvider를 구현하는 공급자 만 Entity Framework 비동기 작업에 사용할 수 있습니다.
그래서 누구든지 내가 사용할 수있는 솔루션이 있습니까? 아니면 컨트롤러에서 확인란을 처리하는 더 좋은 방법이 있습니까?
EF Core를 사용하고 있다고 가정합니다 (linq2db에서도 마찬가지 임)-로컬 컬렉션 (예 : Where(x => checkedTypes.Contains(x.SomeId))
.
당신은에 의해 필터 논리를 가지고 "와"하는 경우 searchString
및 checkedTypes
조건부 추가 할 수있는 것보다 Where
절을 :
if (!string.IsNullOrEmpty(searchString))
{
products = products.Where(p => p.Name.ToLower().Contains(searchString));
}
if(checkedTypes != null)
{
products = products.Where(p => checkedTypes.Contains(p.TypeId));
}
추신
또한 첫 번째 줄을 다음과 같이 변경할 수 있어야합니다.
var products = _db.Products.AsQueryable();
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다