LINQ 쿼리의 이상한 확장 메서드 동작

모하메드시 랄리 자데

Enum 항목의 표시 이름을 저장하는 사용자 지정 특성이 있습니다. Enum 사용자 지정 특성 표시 이름을 반환하는 Extension 메서드를 작성합니다.

LINQ 쿼리에서 Extension 메서드를 사용합니다. 그러나 출력이 이상합니다. 아직 실행되지 않은 쿼리에서 확장 메서드를 호출하면 반환 Enum is null되지만 .ToList()호출 된 쿼리에서 실행하면 제대로 작동합니다 (출력 참조). 둘 사이의 차이점은 무엇입니까? 쿼리가 실행되지 않을 때 enum이 null 인 이유 ..

참고 : 저는 LINQPAD 입니다.

void Main()
{
    Console.WriteLine(((ProductStatuses)0).GetTitle());
    Console.WriteLine(((ProductStatuses)1).GetTitle());
    Console.WriteLine(((ProductStatuses)3).GetTitle());

    var query_01 = (from item in SH_Products
                    select new
                    {
                        Status = item.Status,
                        StatusText = ((ProductStatuses)item.Status).GetTitle(),
                    });

    var query_02 = (from item in SH_Products.ToList()
                    select new
                    {
                        Status = item.Status,
                        StatusText = ((ProductStatuses)item.Status).GetTitle(),
                    });

    query_01.Dump();
    query_02.Dump();
}

public static class ExtensionMethods
{
    public static string GetTitle(this Enum enm)
    {
        if (enm == null)
        {
            return "Enum is null";
        }

        var type = enm.GetType();
        var members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);

        foreach (var item in members)
        {
            if (enm.ToString() == item.Name)
            {
                var attributes = item.GetCustomAttributes(typeof(FaraDisplay), false);

                var attribute = String.Empty;
                if (attributes.Length == 0)
                    attribute = item.Name;
                else
                    attribute = ((FaraDisplay)attributes.Single()).GetName();

                return attribute;
            }
        }

        throw new InvalidEnumArgumentException();
    }
}

public enum ProductStatuses
{
    [FaraDisplay("Inactive Product")]
    Inactive = 0,
    [FaraDisplay("Available Product")]
    Available = 1,
    [FaraDisplay("ComingSoon Product")]
    ComingSoon = 2,
    [FaraDisplay("UnAvailable Product")]
    UnAvailable = 3,
    [FaraDisplay("OrderRegister Product")]
    OrderRegister = 4
}

[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public class FaraDisplay : Attribute
{
    private readonly string _name;

    public FaraDisplay(string name)
    {
        _name = name;
    }

    public string GetName()
    {
        return _name;
    }
}

산출:

비활성 제품
사용 가능한 제품
할수 없음 제품

열거가 null의 경우
열거는 null
열거는 null
열거는 null

비활성 제품
사용 가능한 제품
할수 없음 제품
할수 없음 제품

대런 콥

실제로 문제는 linq to sql이 GetTiltle()sql 문 으로 변환하는 방법을 모르기 때문에 건너 뛰는 것입니다. 을 호출 할 때 ToList()linq를 객체에 사용하고 있으므로 해당 시점에서 단순한 ol '.net이기 때문에 예상대로 작동합니다.

모든 linq 공급자 (엔티티 프레임 워크, nhibernate 등)에는 이와 동일한 문제가 있지만 엔티티 프레임 워크에서 예외가 발생하고 아마도 nhibernate도 발생할 수 있습니다.

수행중인 작업을 기반으로하는 방법이 없으므로 메모리에 개체가 있으면 해당 계산을 수행해야합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

LINQ 쿼리의 이상한 확장 메서드 동작

분류에서Dev

일반 LINQ C # 쿼리를 LINQ 확장 메서드로 변환

분류에서Dev

LINQ 쿼리의 기본 클래스에 확장 메서드 사용

분류에서Dev

LINQ 쿼리의 정수 필드에 대한 유사 메서드

분류에서Dev

SQL 서버 쿼리, 이상한 동작

분류에서Dev

Linq 쿼리 확장

분류에서Dev

Elasticsearch에서 범위 쿼리의 이상한 동작

분류에서Dev

Django에서 동일한 모델에 대한 두 개의 관련 쿼리 확장

분류에서Dev

외장 하드 드라이브의 이상한 동작

분류에서Dev

메서드 재정의 및 이상한 동작

분류에서Dev

JMapViewer : setMovementMouseButton () 메서드의 이상한 동작

분류에서Dev

Linq 확장 메서드를 대리자로 다시 작성하려면 어떻게해야합니까?

분류에서Dev

잘못된 델리게이트의 메서드를 사용한 Swift 프로토콜 확장은 여전히 작동합니다 (?!)

분류에서Dev

LINQ에 대한 SQL 쿼리 linq에서 쿼리 작성 방법

분류에서Dev

장고 쿼리 셋의 예상치 못한 동작

분류에서Dev

REST 클래스 확장 및 동일한 경로에서 메서드 재정의

분류에서Dev

QGraphicsScene에서 확대 및 회전 된 QGraphicsPixmapItem의 이상한 그리기 동작

분류에서Dev

LinQ SQL 쿼리의 데이터 작업

분류에서Dev

이 Linq 표현식에 대한 메서드 기반 쿼리

분류에서Dev

iPhone의 메시지 앱에서 작동하는 iOS 8 앱 확장 / 확장 유형이 있나요?

분류에서Dev

이미지는 플렉스 부모의 높이를 확장하지만 크롬 및 사파리에서 이상한 해킹으로 작동합니다.

분류에서Dev

유니온보다 '확장'키워드에 대한 이상한 동작

분류에서Dev

Android에서 putExtra 메서드의 순서와 관련된 이상한 동작

분류에서Dev

TreeView 확장 / 축소 이상한 동작

분류에서Dev

이미 사용 된 Linq 쿼리는 Enity Framework의 다른 클래스에서 작동하지 않습니다.

분류에서Dev

VBA에서 Scripting.Dictionary 클래스의 .item () 메서드의 이상한 동작

분류에서Dev

WCF 메서드 이상한 동작

분류에서Dev

.hover () 메서드 이상한 동작

분류에서Dev

레코드가 모두 동일한 지 확인하는 Linq 쿼리

Related 관련 기사

  1. 1

    LINQ 쿼리의 이상한 확장 메서드 동작

  2. 2

    일반 LINQ C # 쿼리를 LINQ 확장 메서드로 변환

  3. 3

    LINQ 쿼리의 기본 클래스에 확장 메서드 사용

  4. 4

    LINQ 쿼리의 정수 필드에 대한 유사 메서드

  5. 5

    SQL 서버 쿼리, 이상한 동작

  6. 6

    Linq 쿼리 확장

  7. 7

    Elasticsearch에서 범위 쿼리의 이상한 동작

  8. 8

    Django에서 동일한 모델에 대한 두 개의 관련 쿼리 확장

  9. 9

    외장 하드 드라이브의 이상한 동작

  10. 10

    메서드 재정의 및 이상한 동작

  11. 11

    JMapViewer : setMovementMouseButton () 메서드의 이상한 동작

  12. 12

    Linq 확장 메서드를 대리자로 다시 작성하려면 어떻게해야합니까?

  13. 13

    잘못된 델리게이트의 메서드를 사용한 Swift 프로토콜 확장은 여전히 작동합니다 (?!)

  14. 14

    LINQ에 대한 SQL 쿼리 linq에서 쿼리 작성 방법

  15. 15

    장고 쿼리 셋의 예상치 못한 동작

  16. 16

    REST 클래스 확장 및 동일한 경로에서 메서드 재정의

  17. 17

    QGraphicsScene에서 확대 및 회전 된 QGraphicsPixmapItem의 이상한 그리기 동작

  18. 18

    LinQ SQL 쿼리의 데이터 작업

  19. 19

    이 Linq 표현식에 대한 메서드 기반 쿼리

  20. 20

    iPhone의 메시지 앱에서 작동하는 iOS 8 앱 확장 / 확장 유형이 있나요?

  21. 21

    이미지는 플렉스 부모의 높이를 확장하지만 크롬 및 사파리에서 이상한 해킹으로 작동합니다.

  22. 22

    유니온보다 '확장'키워드에 대한 이상한 동작

  23. 23

    Android에서 putExtra 메서드의 순서와 관련된 이상한 동작

  24. 24

    TreeView 확장 / 축소 이상한 동작

  25. 25

    이미 사용 된 Linq 쿼리는 Enity Framework의 다른 클래스에서 작동하지 않습니다.

  26. 26

    VBA에서 Scripting.Dictionary 클래스의 .item () 메서드의 이상한 동작

  27. 27

    WCF 메서드 이상한 동작

  28. 28

    .hover () 메서드 이상한 동작

  29. 29

    레코드가 모두 동일한 지 확인하는 Linq 쿼리

뜨겁다태그

보관