2016-07-15 47 views
1

這對我來說不是一個重要的概念,但我只是想知道如果我可以在linqselect聲明之後強制鍵入一個新對象,而不是使其成爲匿名類型,請參見C#。下面是一個樣品,被禁當然但講的概念:
LINQ選擇語句後的強類型新對象

public class DisplayAddress { public int AddressId; public string ShortAddress; } 

List<DisplayAddress> shortAddresses = 
    (from la in longAddresses 
    join ca in customerAddresses 
     on la.AddressId equals ca.AddressId 
    where ca.CustomerId == selectedCustomer 
    select new { new DisplayAddress() {AddressId = la.AddressId, ShortAddress = la.Line1 + " " + la.City + " " + la.State}}).Tolist<DisplayAddress>(); 
+3

我覺得你這得太多。只需選擇新的DisplayAddress {AddressId = la.AddressId,...} –

+2

爲什麼要創建一個匿名類型而不是隻選擇新的DisplayAddress? – itsme86

+0

'select new'語句甚至不應該編譯。你沒有在匿名類型中聲明任何成員 –

回答

4

絕對的,可以使用在任何Select表達,包括一個創建你定義的類型的新對象。所有你需要做的就是去除外new

select new DisplayAddress { 
    AddressId = la.AddressId 
, ShortAddress = la.Line1 + " " + la.City + " " + la.State 
}).Tolist(); 

注意,匿名類型是強類型爲好。換句話說,如果你做

select new { 
    AddressId = la.AddressId 
, ShortAddress = la.Line1 + " " + la.City + " " + la.State 
}).Tolist(); 

您的匿名類型將有兩個強類型的字段:AddressIdShortAddress。唯一的區別是,您需要在創建它們的上下文中使用匿名對象,以保持強大的輸入。換句話說,你將無法通過匿名Select到非通用函數的結果,而無需使用dynamicobject

1

你的示例代碼爲真的接近。你過分複雜了一些可能是你倒臺的事情。

在你的select子句中,而不是定義new { new DisplayAddress() ... }只是做new DisplayAddress()。 (您正在有效地將您的DisplayAddress裝入另一個不必要的對象中,還有一個編譯器錯誤:未定義該屬性的成員名稱。)

在查詢結束時,您在做Tolist<DisplayAddress>()。幾個問題:

  • 該方法是ToList()和大寫事項在C#中。 :)
  • 由於您在您的Tolist<DisplayAddress>()調用中指定了DisplayAddress,它導致編譯器錯誤,因爲您無法將您的匿名類型轉換爲強類型的DisplayAddress

後您解決所有這些細小的問題,你想出了以下內容:

var shortAddresses = (from la in longAddresses 
         join ca in customerAddresses 
         on la.AddressId equals ca.AddressId 
         where ca.CustomerId == selectedCustomer 
         select new DisplayAddress() 
         { 
         AddressId = la.AddressId, 
         ShortAddress = la.Line1 + " " + la.City + " " + la.State 
         }).ToList(); 
+0

謝謝。目標是避免使用'var'類型。對不起,大寫 - 我用記事本寫了。 dasblinkenlight抓住了我的漂移點。 – ArtK

+0

用'List '代替'var'仍然不能使用。我只是覺得它更簡單,更簡潔。 (這也使得讀者不必滾動查看代碼段:) – Cameron