LINQ to SQL EntitySet中的漏洞抽象

我遇到了一些dbml生成的类,这些类无法解析为高效的sql.想象一下,我有一个Accounts表和一个Transactions表,其中每个事务都与一个特定的帐户相关联.我将所有这些加载到dbml中,并弹出一个Account类和一个Transaction类. Account类具有对一组事务的EntitySet引用,这些事务表示该帐户上的所有事务.很公平.

现在假设我只想要当前会计期间的交易.所以我添加一个这样的方法

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 for Objects处理它.我已经尝试取出where子句,orderby子句,用常量替换日期,它仍然是客户端完成的.

为了比较,我尝试直接从数据上下文调用Transactions集合:

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].[sign]
FROM [dbo].[transactions] AS [t0]
WHERE ([t0].[date] >= @p0) AND ([t0].[date] <= @p1) AND ([t0].[account_id] = @p2)
ORDER BY [t0].[date]

毕竟,我有两个问题:

> Transactions EntitySet的上述行为是否正确和/或有没有办法解决它?
>如何在我的Account类上实现上述“修复”作为方法. dbml生成实体类无权访问DataContext.

解决方法

遗憾的是,你无法做到这一点.为LINQ to sql实体类生成的集合属性不是IQueryable;因此,对它们执行的任何查询都将使用LINQ to Objects.这是设计的.正如您自己注意到的那样,要获得高效的查询,您必须查询从DataContext获取的事务,但您的属性gettor中没有.

此时您的选择是:

>使它成为一个以DataContext为参数的方法;要么
>使用反射hackery来检索上下文 – 实体本身不会存储它,但实体本身不存储它,虽然是间接的 – 当然这是特定于版本的,容易破损等.

据我所知,Entity Framework没有这个限制,因为它的集合属性是ObjectQuery< T>. – 这是IQueryable.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...