我無法解決某些dbml生成的類無法解析爲高效的SQL。想象一下,我有一個帳戶表和一個交易表,每個交易都與一個特定的帳戶相關聯。我將所有這些加載到dbml中,然後彈出一個Account類和一個Transaction類。 Account類具有一個EntitySet對一組交易的引用,它表示該賬戶上的所有交易。很公平。LINQ to SQL實體集中的抽象抽象
現在假設我只想要當前會計期間的交易。所以,我想補充的方法是這樣的:
public IEnumerable<Transaction> CurrentTransactions
{
get
{
DateTime dtStart = CurrentPeriod;
DateTime dtEnd = NextPeriod;
return
from t in Transactions
orderby t.date
where t.date >= CurrentPeriod && t.date <= NextPeriod
select t;
}
}
看起來不錯,它的工作原理,但SQL不好:
SELECT [t0].[id], [t0].[account_id], [t0].[date], [t0].[description], [t0].[amount], [t0].[sign]
FROM [dbo].[transactions] AS [t0]
WHERE [t0].[account_id] = @p0
即:它是拉動整個集交易下來,處理它與LINQ對象。我已經嘗試去掉where子句,orderby子句,用常量代替日期,但它仍然在客戶端完成。
爲了便於比較,我想直接調用交易收集掉數據方面:
DateTime dtStart = account.CurrentPeriod;
DateTime dtEnd = account.NextPeriod;
IEnumerable<Transaction> trans=
from t in MyDataContext.Transactions
orderby t.date
where t.date >= dtStart && t.date <= dtEnd && t.account_id==iAccountID
select t;
,它精美的作品:
SELECT [t0].[id], [t0].[account_id], [t0].[date], [t0].[description], [t0].[amount], [t0].[sign]
FROM [dbo].[transactions] AS [t0]
WHERE ([t0].[date] >= @p0) AND ([t0].[date] <= @p1) AND ([t0].[account_id] = @p2)
ORDER BY [t0].[date]
畢竟是這樣,我有兩個問題:
- 交易實體集的上述行爲是否正確和/或是否有解決方法?
- 如何在帳戶類中實現上述「修復」作爲方法。由dbml生成的實體類無權訪問DataContext。
實體框架的集合屬性,至少從2009年到現在,不是「ObjectQuery」類型,而是類型爲「EntityCollection 」(但它有一種將它們轉換爲「ObjectQuery 」的方法)。 –
2013-03-21 16:03:08