2009-08-22 44 views
1

我上的存儲庫模式工作,其中API如下所示:通用庫LINQ2SQL阻抗不匹配的問題

var visitor = repository.Find(x => x.EmailAddress == credentials.EmailAddress && 
           x.Password == credentials.Password); 

其中訪問者是一個域對象,x表示此域對象。對信息庫查找方法的方法簽名是:

T Find(Func<T, bool> query); 

這一切都是美好的,直到我嘗試,因爲LINQ2SQL創建其自己的對象與LINQ2SQL使用此,因此,當我想打電話:

context.visitors.FirstOrDefault(query); 

有一個類型不匹配,因爲LINQ2SQL希望它創建的類型,而不是我傳遞的功能的功能

回答

1

好下手,你需要將自己的簽名Find改變:

T Find(Expression<Func<T, bool>> query); 

LINQ to SQL需要將邏輯作爲表達式樹而不是普通委託,否則無法解決如何將其轉換爲SQL。

除此之外,恐怕這不是非常清晰 - 聽起來您不需要爲存儲庫和LINQ to SQL使用相同的域類。是對的嗎?這聽起來像是一個潛在的問題;至少它會讓生活變得非常棘手。

+0

是的......我不想使用Linq2SQL類作爲我的域對象,因爲我可能想要添加行爲到我的域對象,我也可能想限制成員的可訪問性。 – 2009-08-22 18:18:27

+0

添加行爲很簡單:生成的類是*部分類*,這意味着您可以將自己的行爲添加到單獨的文件中,但仍然在同一個類中。您可以在dbml文件中指定屬性可訪問性。 – 2009-08-22 19:22:27

+0

這看起來似乎比將表達式樹從一種類型轉換爲另一種更簡單得多。我將採用這種方法並通過界面限制可見性和訪問。 – 2009-08-23 14:10:55