考虑以下代码:
var query = db.Table
.Where(t => SomeCondition(t))
.AsEnumerable();
int recordCount = query.Count();
int totalSomeNumber = query.Sum();
decimal average = query.Average();
Run Code Online (Sandbox Code Playgroud)
假设query
需要很长时间才能运行.我需要获得记录数,总数SomeNumber
已经返回,并在结束时取平均值.我以为根据我读的是.AsEnumerable()
将执行使用LINQ到SQL,然后使用LINQ到对象的查询Count
,Sum
以及Average
.相反,当我在LINQPad中执行此操作时,我看到相同的查询运行三次.如果我更换.AsEnumerable()
用.ToList()
,它只被查询一次.
我错过了什么AsEnumerable
/做什么?
给出以下LINQ to SQL查询:
var test = from i in Imports
where i.IsActive
select i;
Run Code Online (Sandbox Code Playgroud)
解释的SQL语句是:
SELECT [t0].[id] AS [Id] .... FROM [Imports] AS [t0] WHERE [t0].[isActive] = 1
Run Code Online (Sandbox Code Playgroud)
假设我想在select中执行一些无法转换为SQL的操作.我的理解是,实现这一目标的传统方法是AsEnumerable()
将其转换为可行的对象.
鉴于此更新的代码:
var test = from i in Imports.AsEnumerable()
where i.IsActive
select new
{
// Make some method call
};
Run Code Online (Sandbox Code Playgroud)
并更新了SQL:
SELECT [t0].[id] AS [Id] ... FROM [Imports] AS [t0]
Run Code Online (Sandbox Code Playgroud)
注意执行的SQL语句中缺少where子句.
这是否意味着整个"Imports"表被缓存到内存中?如果表中包含大量记录,这会导致性能下降吗?
帮助我了解幕后实际发生的事情.
我正在使用MVC 4,我必须使用Code First Migrations更新我的数据库.我要做的是从数据库表中选择记录,并将它们插入下拉列表,用户可以在其中选择一个.
我有一个我不明白的错误:
LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression.
控制器:
public ActionResult Addnew()
{
var dba = new DefaultConnection();
var query = dba.blob.Select(c => new SelectListItem
{
Value = c.id.ToString(),
Text = c.name_company,
Selected = c.id.Equals(3)
});
var model = new Companylist
{
xpto = query.AsEnumerable()
};
return View(model);
}
Run Code Online (Sandbox Code Playgroud) 我正在编写类似于以下内容的LINQ查询:
var test = from o in dbcontext.Orders.AsEnumerable()
where o.ID==1
select new Order
{
Name = GetName(o.ID)
};
Run Code Online (Sandbox Code Playgroud)
为了在LINQ查询中调用外部函数,我AsEnumerable()
在查询中使用.
我理解通常在ToList()
调用枚举函数之前不会执行查询.但在这里,我呼吁枚举中查询.
任何人都可以告诉我,这样使用是否被认为是不好的做法AsEnumerable()
?与创建查询ToList()
后调用相比,它会在性能上受损吗?
我有以下查询,它使用实体框架.
Analytic firstSent = (from a in Repository.Query<Analytic>()
where a.EntityType == "Proposal" &&
a.EntityId == Program.ActiveProposal.Id &&
a.Marker == AnalyticMarker.EmailProposalUrl.ToString()
orderby a.TimestampUtc
select a).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
在运行时,我收到以下错误:
LINQ to Entities无法识别方法'System.String ToString()'方法,并且此方法无法转换为存储表达式.
a.Marker
是一个字符串列,AnalyticMarker.EmailProposalUrl
是一个枚举值,我想将该列与该枚举的名称进行比较.
我知道SQL不支持从枚举到字符串的转换,但为什么它不会解析此字符串的值,然后将生成的字符串传递给SQL?这应该工作得很好.
c# ×5
linq ×4
linq-to-sql ×2
.net ×1
asenumerable ×1
asp.net ×1
asp.net-mvc ×1
performance ×1
sql-server ×1