Linq는 IN (A, B, C)에있는 목록에서 객체를 선택


169

의 목록이 orders있습니다. 일련의 주문 상태를 기준으로
선택하고 싶습니다 orders.

본질적으로 select orders where order.StatusCode in ("A", "B", "C")

// Filter the orders based on the order status
var filteredOrders = from order in orders.Order
                     where order.StatusCode.????????("A", "B", "C")
                     select order;

너무 빨리 응답 한 모든 것에 감사합니다. 람다 솔루션을위한 Esp. 람다 식으로 아직 아무것도하지 않았습니다. 나는 (o =>! (statuses.Contains (o.OrderHeaderOrderStatusCode))를 사용하여 NOT을 포함한다고 가정합니다.
MartinS

답변:


288

상태 코드도 모음이므로 다음을 사용하십시오 Contains.

var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));

또는 쿼리 구문에서 :

var filteredOrders = from order in orders.Order
                     where allowedStatus.Contains(order.StatusCode)
                     select order;

1
HashSet의 contains 메소드가 가장 빠르며 1000 개가 넘는 항목이 포함 된 배열의 성능 문제가 있기 때문에 allowedStatus에 배열 대신 HashSet을 사용한다고 말하고 싶습니다. var allowedStatus = new HashSet <string> { "A", "B", "C"};
Jay Shah

15
var statuses = new[] { "A", "B", "C" };

var filteredOrders = from order in orders.Order
                             where statuses.Contains(order.StatusCode)
                             select order;

15

NB : 이것은 LINQ to objects이며, LINQ에서 엔티티로 작동하는지 확실하지 않으며 지금 확인할 시간이 없습니다. 실제로 [A, B, C]에서 x 로 변환하는 것은 어렵지 않지만 스스로 확인해야합니다.

그래서, 대신 포함 의 대체 ???? 코드에서 LINQ-uish 인 Any 를 사용할 수 있습니다 .

// Filter the orders based on the order status
var filteredOrders = from order in orders.Order
                     where new[] { "A", "B", "C" }.Any(s => s == order.StatusCode)
                     select order;

그것은 당신이 SQL에서 알고있는 것과 반대입니다. 이것이 그렇게 분명하지 않은 이유입니다.

물론 유창한 구문을 선호한다면 다음과 같습니다.

var filteredOrders = orders.Order.Where(order => new[] {"A", "B", "C"}.Any(s => s == order.StatusCode));

여기서 우리는 다시 LINQ 놀라움 중 하나를 보게됩니다 (마침내 선택을하는 Joda-speech). 그러나이 점에서 매우 논리적 그것이 점검 항목 중 적어도 하나 (즉 있다면 임의의 리스트에서) (세트, 모음) 한 값과 일치.


12

Contains기능을 사용해보십시오 .

시퀀스에 지정된 요소가 포함되어 있는지 확인합니다.

var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));

-3

조심 .Contains()하십시오. 예기치 않은 문자열을 포함한 모든 하위 문자열과 일치합니다. 예를 들어. new[] { "A", "B", "AA" }.Contains("A")원하지 않는 A와 AA를 모두 반환합니다. 나는 그것에 물렸다.

.Any()또는 .Exists()안전한 선택입니다


new [] { "B", "AA"} .Contains ( "A")는 true가 아닌 false를 반환합니다.
Jay Shah
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.