programing

Linq to SQL "(값 목록)에서 [열] 위치"수행 방법

nasanasas 2020. 8. 30. 08:41
반응형

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

반응형