返回IQueryable<T>与IEnumerable<T>?有什么区别?
IQueryable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
IEnumerable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
Run Code Online (Sandbox Code Playgroud)
两者都会延迟执行,何时应该优先于另一个?
什么是使用IQueryable在LINQ的背景下?
它是用于开发扩展方法还是任何其他目的?
我对这种差异感到困惑.作为.Net的新手,我知道我可以IEnumerables使用Linq扩展进行查询.那么这是什么IQueryable以及它有何不同?
另请参见IQueryable [T]和IEnumerable [T]之间的区别是什么?与这个问题重叠.
我试图了解IQueryable,ICollection,IList和IDictionary接口之间的区别,这对于迭代,索引,查询等基本操作来说更快.
像Collection,List,Dictionary等类这样的类可以很好地启动这些接口,什么时候应该使用这些类.使用这些类比其他类的基本优势.
我尝试阅读其他类似问题的帖子,但没有回答我的完整问题.谢谢您的帮助.
在.Net 4.0上的C#的上下文中,是否有任何内置对象可以实现IQueryable<T>?
我实例化一个上下文,并希望编写一个简单的查询
var result = db.Set.Where(x => x.Id == num).Select(whatever);
Run Code Online (Sandbox Code Playgroud)
而且我无法摆脱"Where"抱怨System.Collections.Generic.IEnumerable和System.Linq.IQueryable之间模糊调用的红色波浪形.System.Linq是专门引用的,System.Collections.Generic不会在项目中的任何位置引用.如何告诉代码我想使用System.Linq.IQueryable?
帕梅拉
我有一个关于Entity Framework查询执行性能的问题.
架构:
我有这样的表结构:
CREATE TABLE [dbo].[DataLogger]
(
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[ProjectID] [bigint] NULL,
CONSTRAINT [PrimaryKey1] PRIMARY KEY CLUSTERED ( [ID] ASC )
)
CREATE TABLE [dbo].[DCDistributionBox]
(
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[DataLoggerID] [bigint] NOT NULL,
CONSTRAINT [PrimaryKey2] PRIMARY KEY CLUSTERED ( [ID] ASC )
)
ALTER TABLE [dbo].[DCDistributionBox]
ADD CONSTRAINT [FK_DCDistributionBox_DataLogger]
FOREIGN KEY([DataLoggerID]) REFERENCES [dbo].[DataLogger] ([ID])
CREATE TABLE [dbo].[DCString]
(
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[DCDistributionBoxID] [bigint] NOT NULL,
[CurrentMPP] [decimal](18, 2) NULL,
CONSTRAINT [PrimaryKey3] …Run Code Online (Sandbox Code Playgroud) c# sql-server entity-framework sql-server-2008 entity-framework-6
看完这个问题后,我需要澄清一些事情.
IQueryable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
IEnumerable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
Run Code Online (Sandbox Code Playgroud)
问题:
1)可以这么说:在第一个查询中,SQLServer正在运行整个操作,包括where子句,只返回相关的行 - 而第二个查询SELECT *...并将所有 行返回 到C#和THEN过滤器?
2)如果我只有一个集合 - 在记忆中怎么样?(var lstMyPerson = new List<MyPerson>())
IQueryable<MyPerson> lst = from c in lstMyPerson
where c.City == "<City>"
select c;
Run Code Online (Sandbox Code Playgroud)
VS
IEnumerable<MyPerson> custs = from c in lstMyPerson
where c.City == "<City>"
select c; …Run Code Online (Sandbox Code Playgroud) 更新2013-08-22:
看了"建立一个IQueryable提供者系列"(感谢链接!)后,我进一步了解了一下.我相应地更新了代码.它仍然没有完全工作.如果我正确理解了教程,GetEnumerator则在请求多个元素的情况下调用(例如,通过ToList()调用queryable或任何聚合函数).所以GetEnumerator包装器的所有实现都要Execute在提供者上调用一个并传递可查询的表达式.在另一种情况下,如果只请求一个元素,Execute则直接调用.queryable的表达式还反映了它是单个元素还是多个元素.它是否正确?
不幸的是,现在我在调用源查询提供程序时得到一个InvalidOperationException,说"Sequence包含多个元素"Execute.这是什么意思?我只是传递表达式而没有任何翻译,因为如上所述涉及相同的类型.IEnumerable代码中的翻译位可能不完整,但是现在我甚至没有达到这一点.
我正在尝试使用单个底层IQueryable作为数据源来实现一个简单的IQueryable包装器,该数据源为每个结果对象调用转换函数.
我认为这将是相对微不足道的,因为包装器唯一要做的就是翻译.但是我无法让我的实现工作.
请看下面我到目前为止所得到的内容.对于某些查询,它正在工作,但我在某些时候收到StackOverflowException InvalidOperationException.我想这是因为我的queryable和我的查询提供程序之间的循环关联.但我不明白如何正确实现这一点.
在这里我的问题和想法:
1.为什么IQueryable有一个Provider又可以再次返回IQueryable?这不是要求无休止的递归吗?
2.为什么不能实现IEnumerator?为什么FirstOrDefault不使用枚举器来获取元素?当我调试应用程序时GetEnumerator()没有被我的可查询器上的FirstOrDefault()调用.
3.由于在每种情况下都没有使用枚举器,因此调用翻译函数的正确位置在哪里?QueryProvider的Execute-methods似乎是正确的地方.但在某些情况下,我仍然需要在枚举器中进行翻译调用吗? 更新:我知道我意识到我需要提供自己的IEnumerable实现,TranslatingEnumerator并从我的Execute方法返回这个枚举.为了获得枚举器GetEnumerator调用Execute(见下文).请求枚举器的LINQ代码似乎确保表达式实际返回一个IEnumerable.
关于代码的一些附注:
翻译源类型名为TDatabaseEntity,翻译目标类型名为TBusinessEntity.
我基本上提供了一个IQueryable,它从基础IQueryable中获取结果对象,并将它们转换为TBusinessEntity 类型 对象.
我知道表达式也需要翻译.但是我将它放在一边,因为在我的实际应用程序中,我使用相同类型的TBusinessEntity和TDatabaseEntity,因此Expression可以直接传递.
尽管属性相同,但结果对象仍然需要转换为其他实例.更新:我的翻译层已经在我的应用程序中工作,并且还负责相关实体.它只是'实现一个IQueryable包装'的东西,我坚持.
我担心整个实现都是错误的 - 代码中的TODO只是我自己的注释.
背景:我在我的数据访问层中实现了自己从DbContext接收的实体的分离,以防止我的业务层与实际实体联系 - 由于EF和其他要求的一些错误,我不能直接使用EF分离实体.
谢谢你的帮助!
internal class TranslatingQueryable<TDatabaseEntity, TBusinessEntity> : IQueryable<TBusinessEntity>
{
private readonly IQueryProvider _provider;
private readonly IQueryable<TDatabaseEntity> _source; …Run Code Online (Sandbox Code Playgroud) 我在ASP.NET Core上有一个MVC项目,我的问题与IQueryable和异步相关.我写了以下搜索方法IQueryable<T>:
private IQueryable<InternalOrderInfo> WhereSearchTokens(IQueryable<InternalOrderInfo> query, SearchToken[] searchTokens)
{
if (searchTokens.Length == 0)
{
return query;
}
var results = new List<InternalOrderInfo>();
foreach (var searchToken in searchTokens)
{
//search logic, intermediate results are being added to `results` using `AddRange()`
}
return results.Count != 0 ? results.Distinct().AsQueryable() : query;
}
Run Code Online (Sandbox Code Playgroud)
我在方法中称之为ExecuteAsync():
public async Task<GetAllInternalOrderInfoResponse> ExecuteAsync(GetAllInternalOrderInfoRequest request)
{
//rest of the code
if (searchTokens != null && searchTokens.Any())
{
allInternalOrderInfo = WhereSearchTokens(allInternalOrderInfo, searchTokens);
}
var orders = await …Run Code Online (Sandbox Code Playgroud) c# asynchronous entity-framework asp.net-core-mvc asp.net-core
c# ×7
iqueryable ×6
linq ×6
.net ×3
ienumerable ×3
.net-3.0 ×1
asp.net-core ×1
asynchronous ×1
c#-4.0 ×1
collections ×1
interface ×1
linq-to-sql ×1
list ×1
performance ×1
sql-server ×1
types ×1