2017-09-08 1 views
3

다음 linq-to-SQL 식에서는 null 포인터 예외가 발생합니다.null 개체가있는 Linq-to-SQL 식 NPE

나는 nameList이 null이라는 것을 발견했습니다. 그러나 다음 업데이트는 도움이되지 않습니다.

u => nameList == null || nameList.Contains(u.Name) 

Google 검색에서 평가 중에 NPE가 SQL로 변환하는 동안 발생한다는 것을 발견했습니다. 이 문제를 해결할 수있는 방법이 있습니까? .FindSync(u => ......) 안에 다른 컨텍스트/영역/차원에서 일이 무엇

+0

'List nameList = GetNames() ?? Enumerable.Empty () .ToList()'및 db 호출을 동일하게 유지하십시오. –

+0

@DanD 그럴 수도 있지만 쿼리는 모든 사용자가 아닌 빈 목록을 반환합니다. nameLists가 null이면 db의 모든 사용자 요소를 반환하고 싶습니다. – user845279

+0

해결 방법으로 간단한 if 문을 사용할 수 없습니까? –

답변

1

처럼 어쩌면 LINQ 뭔가하기 전에/외부 NULL 체크를 수행해야한다. 이 문제를 해결하기 위해 보통 사용하는 방법이 있습니다.

var list = new string[] { "One", "Two", "Three" }; 
var list2 = new string[] { "One", "Five" }; 
var db = new string[] { "One", "Two", "Four" }; 

var conditions = new List<Func<String, bool>>(); 
if (list != null) 
{ 
    conditions.Add(s => list.Contains(s)); 
} 

if (list2 != null) 
{ 
    conditions.Add(s => list2.Contains(s)); 
} 

var query = db.AsEnumerable(); // AsQuerable on your side. 
foreach (var condition in conditions) 
{ 
    query = query.Where(condition); 
} 

var result = query.ToList(); // Outputs "One". 
3

생각해은 및 Only entity types, enumeration types or primitive types are supported in this context.

당신은 라이브러리가 SQL에 그 지원 변환을했기 때문에 그것은이다 "그런데 왜 nameList.Contains가 작동"생각할 수 있습니다. 안타깝게도 nameList 자체는 지원되지 않으며 nameList == null도 지원되지 않습니다.

귀하의 솔루션은 여기에 약간의 옵션이 보인다

var uResult = nameList == null ? db.Users.GetAll() : db.Users.FindSync(u => nameList.Contains(u.Name))