2009-02-07 141 views
0

如果我有這樣的:LINQ和對象初始化

var query = from children in _data.Children 
    where children.ChildId == childId 
    select new CustomModel.MyChild 
    { 
     ChildId = children.ChildId, 
     Name = children.ChildName 
    }; 

return query.FirstOrDefault(); 

我想要得到的對象是我的自定義模式。

我可以使用不同的方法處理自定義模型實例嗎?如果我有多個linq查詢都可以生成自定義子模型,那麼這個方法可以重用嗎?

例如,

var query = from children in _data.Children 
    where children.ChildId == childId 
    select CreateMyCustomChild([param ??]); 

return query.FirstOrDefault(); 

這可能是不可能的,我不知道,但將方法簽名是什麼樣的,如果它是可能的嗎?

我只想在多個linq查詢包含重複的對象初始化代碼時重用。

感謝

回答

1

這真的取決於您使用的是哪個版本的LINQ。如果您使用LINQ to SQL,我不相信您可以在查詢中調用任意方法。查詢翻譯器將不知道如何處理方法調用

如果您使用LINQ到對象,你是絕對沒這樣做,這樣做:

var query = from children in _data.Children 
    where children.ChildId == childId 
    select CreateMyCustomChild(children) 

return query.FirstOrDefault(); 

// Elsewhere 

public CustomModel.MyChild CreateMyCustomChild(OtherChild child) 
{ 
    return new CustomModel.MyChild 
    { 
     ChildId = child.ChildId, 
     Name = child.ChildName 
    }; 
} 

(旁註:我會在查詢「child」而不是「children」時調用範圍變量,因爲在任何時候它只代表一個孩子。)

+0

@喬恩 - 謝謝。可悲的是,它是linqtosql。還有關於奇異孩子的觀點。 – 2009-02-08 13:09:35

0

如果你想你可以寫「選擇1」或你的情況「CreateMyCustomChild(孩子)」,因爲「孩子」是包含您的所有信息。在你的情況下,你不會爲「孩子」添加很多信息,那麼爲什麼不「選擇孩子」呢?

換句話說,試試吧。您的值的返回類型將決定您的LINQ枚舉的類型。

0

假設您有一種方法可以爲您進行轉換。

public static class Conversions 
{ 
    public static CustomModel.MyChild ToCustomModel(this DataModel.MyChild source) 
    { 
    return new CustomModel.MyChild() 
    { 
     ChildId = source.ChildId, 
     Name = source.ChildName 
    } 
    } 
} 

您可以使用這種方法來完成單個項目的轉換。

DataModel.MyChild myResult = getResult(); 
CustomModel.MyChild myConvertedResult = myResult.ToCustomModel() 

這樣的方法也可用於方法調用Enumerable.Select

IEnumerable<DataModel.MyChild> myQueriedResults = getResult(); 
IEnumerable<CustomModel.MyChild> myConvertedResults = 
    myQueryiedResults.Select(c => c.ToCustomModel()); 
0

雖然你可以使用表達式,但我不認爲這是值得的麻煩。相反,我建議你這樣定義的擴展方法:

IQueryable<CustomModel.MyChild> ToModel(this IQueryable<Child> childs) 
{ 
    return childs.Select(c=> 
     select new CustomModel.MyChild 
     { 
      ChildId = children.ChildId, 
      Name = children.ChildName 
     }  
    ); 
} 

然後,您可以撥打:

return _data.Children 
    .Where(c=>c.ChildId == childId) 
    .ToModel() 
    .FirstOrDefault();