我有一個複雜的查詢,我在代碼中使用了好幾次。我用它來獲得所有項目或只是一個項目:可擴展的Linq查詢
from item in _db.Tests ... select getItem(item)
from item in _db.Tests ... where item.Id == id select getItem(item)
我想不重複的公共部分,只叫「的getItem」我是否會使用它。
我試圖創建一個這樣的功能:
from item in _db.Tests ...
但是編譯器會抱怨,因爲我確實不是一個選擇。
我還可以創建一個:
private IQueryable<Test> getTests()
{
return from item in _db.Tests ... select item;
}
,然後調用它像這樣:
from t in getTests() select getItem(t)
但是,這可能不會利用優化LINQ是能夠的,對吧?
你能幫我嗎?
編輯
我意識到我的問題是比較複雜的:點(...)實際上是連接和爲getItem功能使用信息,從連接和做一些計算。我想有一個函數來獲取所有的項目和一個不同的項目來獲得一個特定的項目(我想從程序的其餘部分隱藏查詢邏輯)。
我想這樣做的:
private IQueryable<Tuple<Table1, Table2, Table3, Table4>> queryItems()
{
return from t1 in _db.Table1s
join t2 in _db.Table2s on t1.T2ID equals t2.ID into outerT2 from t2 in outerT2.DefaultIfEmpty()
join t3 in _db.Table3s on t1.T3ID equals t3.ID into outerT3 from t3 in outerT3.DefaultIfEmpty()
join t4 in _db.Table4s on t1.T4ID equals t4.ID into outerT4 from t4 in outerT4.DefaultIfEmpty()
select new Tuple<Table1, Table2, Table3, Table4>(t1, t2, t3, t4);
}
public IEnumerable<Item> GetItems()
{
return from i in queryItems()
select getItem(i.Item1, i.Item2, i.Item3, i.Item4);
}
public Item GetItem(int id)
{
return from i in queryItems()
where i.Item1.ID equals id
select getItem(i.Item1, i.Item2, i.Item3, i.Item4);
}
我不希望把中的getItem因爲queryItems它做一些計算,並在的GetItem(INT ID)的情況下,將運行它每個元素(對吧?)。
這是做這份工作的好方法嗎?有更漂亮的方法嗎?更有效的方法?
流利的語法?試試看。 –
@newStackExchangeInstance如果使用方法或查詢語法,則無關緊要。兩人都有能力做他想做的事。 – Servy
@Servy它會更容易。 –