2017-04-24 83 views
-1

我需要EF中Linq的一些幫助。我有一個名爲「CustomerKind」的EKind類的客戶表,它是一種Enum類型(Kind1,Kind2,Kind3)。在EF Linq中切換

我也有額外的表,可以說「Kind1Details」,「Kind2Details」和「Kind3Details」。每個細節表都包含一個特殊的名稱(列名稱)。

現在我想用EF Linq語句來繪製信息。如果CustomerKind是Kind1,我需要表Kind1Details的名稱,如果它是Kind2Details的Kind2和Kind3Details的Kind3。所以實際上我需要在select new子句中進行切換。像這樣:

  var customerList=from customer in context.Customer 
          select new 
          { 
           Id=customer.Id, 
           Kind=customer.CustomerKind, 
           if(Kind==EKind.Kind1) 
            Name=customer.Kind1.Name 
            if (Kind == EKind.Kind2) 
            Name = customer.Kind2.Name 
           if (Kind == EKind.Kind3) 
            Name = customer.Kind3.Name 
          } 

我可以加載所有數據並在查詢後再次遍歷它,但也許有更好的方法。

最後我明白了,謝謝你們。這是我工作的解決方案:

var customerList = from customer in context.Customer 
        select new 
        { 
         Id = customer.Id, 
         Kind = customer.CustomerKind, 
         Name1 = (Kind == EKind.Kind1) ? customer.Kind1.Name : null, 
         Name2 = (Kind == EKind.Kind2) ? customer.Kind2.Name : null, 
         Name3 = (Kind == EKind.Kind3) ? customer.Kind3.Name : null, 

         Age1 = (Kind == EKind.Kind1) ? customer.Kind1.Age : 0, 
         Age2 = (Kind == EKind.Kind2) ? customer.Kind2.Age : 0, 
         Age3 = (Kind == EKind.Kind3) ? customer.Kind3.Age : 0, 

        }; 

return customerList.Select(r => new CustomerOV 
{ 
    Age = r.Age1 + r.Age2 + r.Age3, 
    Name = r.Name1 ?? r.Name2 ?? r.Name3, 
}).ToList(); 

尼科

+0

我相信你正在尋找的字[鑑別](http://stackoverflow.com/questions/24333297/entity-framework-do-case-on-discriminator) – CodingYoshi

+1

有沒有聽說過[? :條件運算符](https://msdn.microsoft.com/en-us/library/ty67wk28.aspx) –

+0

請不要用您的答案編輯您的問題。如果您的解決方案與提供的答案之一明顯不同,請提交您自己的答案並接受答案。但是,如果提供的答案之一有效,請接受。無論如何,不​​要在你的問題中提出答案。 – krillgar

回答

-1
var customerList = from customer in context.Customer 
         select new { 
          Id=customer.Id, 
          Kind=customer.CustomerKind, 
          Name = (Kind == EKind.Kind1) ? customer.Kind1.Name : 
            (Kind == EKind.Kind2) ? customer.Kind2.Name : 
            (Kind == EKind.Kind3) ? customer.Kind3.Name : "bad kind", 
          Age = (Kind == EKind.Kind1) ? customer.Kind1.Age : 
            (Kind == EKind.Kind2) ? customer.Kind2.Age : 
            (Kind == EKind.Kind3) ? customer.Kind3.Age : 0 
         }; 
+0

這會導致編譯器錯誤CS0746 無效的匿名類型成員聲明器。匿名類型成員必須聲明爲成員分配,簡單名稱或成員訪問權限。 必須使用成員分配,簡單名稱或成員訪問權限聲明匿名類型。 – Dosihris

+0

對不起,你是對的,輸入錯誤的原始答案。 – NetMage

2

中爭取在對方的回答評論,但它是太長了。該?:運營商產生分配的右手邊,所以正確的方式來使用它會是:

var customerList = from customer in context.Customer 
        select new 
        { 
         Id = customer.Id, 
         Kind = customer.CustomerKind, 
         Name = (Kind == EKind.Kind1) 
          ? customer.Kind1.Name 
          : (Kind == EKind.Kind2) 
           ? customer.Kind2.Name 
           : (Kind == EKind.Kind3) 
            ? customer.Kind3.Name 
            : "Unknown Kind" 
        }; 
+0

感謝rufus,這看起來不太好,但它工作。我已經說得更清楚一點,並在我的初始職位中回答了我自己的問題。謝謝 – Dosihris