Linq to sql Linq to Sql:Join,为什么我需要加载集合

Linq to sql Linq to Sql:Join,为什么我需要加载集合,linq-to-sql,c#-3.0,Linq To Sql,C# 3.0,我有两个表需要一直一起加载,这两个表必须同时存在于数据库中。然而,我想知道为什么Linq to Sql要求我必须在集合中加载,然后进行联接,我只想联接两个表,其中一个记录的参数say=5,例如 var data = _repo.All<TheData>(); //why do I need a collection/IQueryable like this? var _workflow = _repo.All<WorkFlow>() .W

我有两个表需要一直一起加载,这两个表必须同时存在于数据库中。然而,我想知道为什么Linq to Sql要求我必须在集合中加载,然后进行联接,我只想联接两个表,其中一个记录的参数say=5,例如

var data = _repo.All<TheData>(); //why do I need a collection/IQueryable like this?

var _workflow = _repo.All<WorkFlow>()
                .Where(x => x.WFID== paramid)
                .Join(data, x => x.ID, y => y.WFID, (x, y) => new
                {
                    data = x,
                    workflow = y
                });

var data=_repo.All()类似于说“开始针对数据表构建查询”。
此函数返回一个IQueryable,其中包含针对数据库的查询定义

因此,这并不意味着您要用这一行加载整个数据表数据

查询将在执行.Count()、.Any()、First()、Single()或ToList()等操作时执行。这称为延迟执行

如果使用SingleOrDefault()结束查询,这将创建一个连接两个表的sql查询,添加筛选器并选择最顶端的记录或null(如果有更多记录,则抛出错误!)

您还可以使用Linq而不是查询扩展方法。 它看起来像:

var data = _repo.All<TheData>(); 

var _workflow = from w in _repo.All<WorkFlow>()
                join t in _repo.All<TheData> on  w.Id equals t.WFID
                where x.WIFD = paramid
                select new
                {
                    data = t,
                    workflow = x
                });
var数据=_repo.All();
var _workflow=从w在_repo.All()中
在w.Id等于t.WFID时加入t
其中x.WIFD=paramid
选择新的
{
数据=t,
工作流=x
});
var data = _repo.All<TheData>(); 

var _workflow = from w in _repo.All<WorkFlow>()
                join t in _repo.All<TheData> on  w.Id equals t.WFID
                where x.WIFD = paramid
                select new
                {
                    data = t,
                    workflow = x
                });