Linq to SQL "(값 목록)에서 [열] 위치"수행 방법
ID 목록을 가져 오는 함수가 있으며 ID와 관련된 설명과 일치하는 목록을 반환해야합니다. 예 :
public class CodeData
{
string CodeId {get; set;}
string Description {get; set;}
}
public List<CodeData> GetCodeDescriptionList(List<string> codeIDs)
//Given the list of institution codes, return a list of CodeData
//having the given CodeIds
}
따라서 직접 SQL을 생성하는 경우 다음과 같이 간단히 수행합니다 (in 절에 codeIds 인수의 모든 값이 포함됨).
Select CodeId, Description FROM CodeTable WHERE CodeId IN ('1a','2b','3')
Linq to Sql에서 "IN"절에 해당하는 것을 찾을 수 없습니다. 지금까지 찾은 것 중 최고 (작동하지 않음)는 다음과 같습니다.
var foo = from codeData in channel.AsQueryable<CodeData>()
where codeData.CodeId == "1" || codeData.CodeId == "2"
select codeData;
문제는 linq to sql에 대한 "OR"절 목록을 동적으로 생성 할 수 없다는 것입니다. 왜냐하면 그것들은 컴파일 타임에 설정되기 때문입니다.
Linq to Sql을 사용하여 동적 값 목록에 열이 있는지 확인하는 where 절을 어떻게 수행합니까?
사용하다
where list.Contains(item.Property)
또는 귀하의 경우 :
var foo = from codeData in channel.AsQueryable<CodeData>()
where codeIDs.Contains(codeData.CodeId)
select codeData;
그러나 점 표기법으로하는 것이 좋습니다.
var foo = channel.AsQueryable<CodeData>()
.Where(codeData => codeIDs.Contains(codeData.CodeId));
다음을 사용할 수도 있습니다.
List<int> codes = new List<int>();
codes.add(1);
codes.add(2);
var foo = from codeData in channel.AsQueryable<CodeData>()
where codes.Any(code => codeData.CodeID.Equals(code))
select codeData;
나는 Jon Skeet의 대답에서 방법을 사용하고 있었지만 Concat
. 이 Concat
방법은 제한된 테스트에서 약간 더 잘 수행되었지만 번거롭고 아마도를 계속 사용 Contains
하거나 나를 위해이 작업을 수행하는 도우미 메서드를 작성할 것입니다. 어느 쪽이든 관심이있는 사람이 있다면 다음과 같은 또 다른 옵션이 있습니다.
방법
// Given an array of id's
var ids = new Guid[] { ... };
// and a DataContext
var dc = new MyDataContext();
// start the queryable
var query = (
from thing in dc.Things
where thing.Id == ids[ 0 ]
select thing
);
// then, for each other id
for( var i = 1; i < ids.Count(); i++ ) {
// select that thing and concat to queryable
query.Concat(
from thing in dc.Things
where thing.Id == ids[ i ]
select thing
);
}
성능 테스트
이것은 과학적이지 않았습니다. 데이터베이스 구조와 목록에 포함 된 ID의 수가 상당한 영향을 미칠 것이라고 생각합니다.
I set up a test where I did 100 trials each of Concat
and Contains
where each trial involved selecting 25 rows specified by a randomized list of primary keys. I've run this about a dozen times, and most times the Concat
method comes out 5 - 10% faster, although one time the Contains
method won by just a smidgen.
var filterTransNos = (from so in db.SalesOrderDetails
where ItemDescription.Contains(ItemDescription)
select new { so.TransNo }).AsEnumerable();
listreceipt = listreceipt.Where(p => filterTransNos.Any(p2 => p2.TransNo == p.TransNo)).ToList();
참고URL : https://stackoverflow.com/questions/1075540/linq-to-sql-how-to-do-where-column-in-list-of-values
'programing' 카테고리의 다른 글
공변 반환 유형이란 무엇입니까? (0) | 2020.08.30 |
---|---|
.cc와 .cpp 파일 접미사의 차이점은 무엇입니까? (0) | 2020.08.30 |
Android에서 Webview의 글꼴을 변경하는 방법은 무엇입니까? (0) | 2020.08.29 |
Android에서 Looper, Handler 및 MessageQueue의 관계는 무엇입니까? (0) | 2020.08.29 |
Javascript / jQuery의 배열에서 여러 요소 제거 (0) | 2020.08.29 |