你想要做的是什麼: IList <MyClass> myList2 = myRepository.GetBy (x => x.Name == "SomeName" && x.ID
= 5); 確實,您可以代表x => x.Name == "SomeName" && x.ID = 5 with Expression <Func <T, bool >>
但您也可以只使用代表Func <T, bool>
。
無論哪個均取數據將總是從IEnumerable <T>
所以你總是將具有Where
方法(無論何時使用的命名空間System.Linq
),它接受作爲參數委託Func <T, bool>
的。如果對象IEnumerable <T>
是DbSet <T>
,這將負責轉換SQL查詢中的代表Func <T, bool>
。請記住,正在使用的Linq查詢僅在查詢數據被使用或與方法ToList()
或ToArray()
(例如)一致時纔會執行。
例如:您從任何地方甚至從的EntityFramework的DbSet獲取數據 IEnumerable <MyClass> list = ...
var query = list.Where (x => x.Name == "SomeName" && x.ID = 5);
查詢是shost查詢,它不包含任何數據,直到做到這一點
foreach (var x in list) is being consumed, so the query is executed
{
var c = x.Name;
}
或本
`var temp = query.ToList();`
這個力量存儲在一個List <MyClass>
所有這一切,我想說的是,如果你使用EntityFramework的DbSet,會發生什麼是委託Func <T, bool>
轉換成一個SQL查詢,以便數據管理器負責過濾數據(應該是)。 從這個只有你自己必須只需你的方法
public IList <T> GetBy (Func <T, bool> expression)
{
origen.Where (expression).ToList();
}
http://msdn.microsoft.com/en-us/library/bb882521(v=vs.90).aspx – MarcinJuraszek 2014-10-18 01:26:09
什麼阻止你做'blah.Where(expression.Compile())'? – DavidG 2014-10-18 02:17:11
@DavidG這將是低效的。 'Compile'返回委託,所以在從數據庫獲取所有對象之後,預測將在服務器端應用。它會問爲什麼不使用'queryable。Where(expression);' – 2014-10-18 05:48:09