2008-12-10 92 views
2

我有LINQ聲明,看起來像這樣:封裝LINQ的select語句

return (from c in customers select new ClientEntity() { Name = c.Name, ... }); 

我希望能抽象出選擇到它自己的方法,這樣我可以有不同的「映射」選項。我的方法需要返回什麼?

從本質上說,我想我的LINQ查詢,看起來像這樣:

return (from c in customers select new Mapper(c)); 

編輯:

這是LINQ to SQL的。

回答

4

新的答案,現在我已經注意到,它的LINQ to SQL ... :)

如果你看一下版本選擇上IQueryable<T>工作並不需要Func<In, Out>。相反,它需要Expression<Func<In, Out>>。編譯器知道如何從lambda生成這樣的東西,這就是爲什麼你的普通代碼編譯的原因。

所以有各種各樣的準備,通過使它們使用選擇選擇映射功能,你可以宣稱他們是這樣的:

private static readonly Expression<Func<CustomerInfo, string>> GetName = c => c.Name; 

private static readonly Expression<Func<CustomerInfo, ClientEntity>> GetEntity = c => new ClientEntity { Name = c.Name, ... }; 

你會再使用它們像這樣:

var names = customers.Select(GetName); 

var entities = customers.Select(GetEntity); 
0

這是針對linq的對象嗎?或者爲了一個linq?

因爲......選擇新的映射器(C),要求「C」已經被物化到一個對象,然後傳遞給映射器()構造函數。 (如「C」是不是在分貝水平已知的,只是在.NET水平)

1

您可能需要使用的,而不是使用LINQ語法鏈接方法,然後你就可以在任何的傳遞各種Expression<Func<TSource, TResult>>值您指定:

Expression<Func<CustomerTable, Customer>> someMappingExpression = c => new Customer { Name = c.Name }; 
return context.CustomerTable.Select(someMappingExpression); 

UPDATE: Select需要 Func,而不是一個 Expression
UPDATE:Select應該使用的函數確實是Expression<Func>,而不僅僅是Func

+0

本例中的代碼示例是一個語法錯誤,不是嗎?同樣,對於Linq to SQL,註釋「Select採用FUnc而不是表達式」是不正確的。 – 2008-12-10 22:15:37

+0

好多了! :) – 2008-12-11 16:09:34

0

順便說一下:這裏所描述的解決方案只有在你想在單獨的查詢子句中使用代碼的'因式分解'部分(例如Select)時纔有效。如果您希望將其用作子句的一部分,該子句也會執行其他一些操作(可能會返回帶有其他信息的匿名類型),則需要使用Expression.Xyz方法動態構建整個表達式樹。

另外,您可以使用的伎倆用於嵌入,我這裏所描述的lambda表達式: