使用实体框架时,ESQL的性能是否优于Linq to Entities?
我更喜欢使用Linq to Entities(主要是因为强类型检查),但我的其他一些团队成员都将性能作为使用ESQL的理由.我想充分了解使用这两种方法的专家/骗子.
我想知道是否有更适合使用ESQL的情况?
通常,我发现ESQL令人沮丧(特别是在需要完全限定实体类型的所有特殊情况下)并且可能使用ESQL完成的任何操作都可以通过SQL或LINQ完成.
但我想知道ESQL更适合解决方案的情况,或者比使用SQL或LINQ(更容易/更快地编码或更好的性能等)具有竞争优势的情况
那么,这里的妥协是什么?什么时候使用三种方法中的每一种来查询EF4更好?
过去一周,我一直在博客圈阅读Linq to SQL已经死亡[以及EF和Linq to Entities的长期存在].但是当我阅读MSDN上的概述时,我觉得Linq to Entities就像Linq to SQL生成SQL查询一样生成eSQL.
现在,由于底层实现(以及SQL Server还不是ODBMS)仍然是一个Relational存储,在某些时候,Entity框架必须转换为SQL查询.为什么不修复Linq to SQL问题(m:m关系,只有SQL服务器支持等)并使用Linq to SQL作为生成这些查询的层?
这是因为性能还是EF使用不同的方式将eSQL语句转换为SQL?
在我看来 - 至少对于我没有学过的头脑 - 在EF中自然适合Linq to SQL.
评论?
linq linq-to-entities entity-framework entity-sql linq-to-sql
我有一个LINQ to Entities查询
From item In ctx.Items
Select new {
ListPrice = item.Cost / (1M - item.Markup)
};
Run Code Online (Sandbox Code Playgroud)
我可以指定EF,我希望它应用cast查询和物化之前将其标价1?有什么EntityFunctions.Cast可能吗?或者我可以使用ESQL cast功能吗?
我希望LINQ能够沿着这些方向生成SQL查询
SELECT cast((Cost / (1 - Markup)) as decimal(10, 2)) AS ListPrice
Run Code Online (Sandbox Code Playgroud)
1我的目标是摆脱一堆精度/缩放查询.因为有十进制减法和除法,所以数学结果是小数(38,26)!这比.NET可以处理的更多,而且超出了我的需要.
我有执行recrusive基于输入,这是一个csv字符串IDS与CTE选择一个SQLServer功能.
不幸的是我不能使用"选项(MAXRECURSION 0)"我的函数中,必须在执行功能时使用.问题是我无法找到如何在EntityFramework的EntitySql中使用此选项.
考虑到我的函数被调用MyRecursiveFunction,这里有一些代码片段:
public virtual IQueryable<MyFunctionReturnType> ExecuteMyFunction(IObjectContextAdapter objContextAdapter, string csvIds)
{
var idsParam = new ObjectParameter("idsParam", csvIds);
// This is the original one, that works, but has no "option(maxrecursion 0)"
return objContextAdapter.CreateQuery<MyFunctionReturnType>("[MyRecursiveFunction](@idsParam)", idsParam);
// gives me an error of incorrect syntax near "option"
return objContextAdapter.CreateQuery<MyFunctionReturnType>("select VALUE tblAlias from [MyRecursiveFunction](@idsParam) as tblAlias OPTION(MAXRECURSION 0)", idsParam);
// Also gives me syntax error:
return objContextAdapter.CreateQuery<MyFunctionReturnType>("MyRecursiveFunction(@idsParam) option(maxrecursion 0)", idsParam);
}
Run Code Online (Sandbox Code Playgroud)
任何人都知道如何使用option(maxrecursion 0)entitySql?
我知道我可以使用"ExecuteStoreQuery"来执行我想要的任何sql查询,但我确实需要一个IQueryable,因为"ExecuteMyFunction"的返回将在实现之前与另一个IQueryable连接.
请节省您的时间和不建议调用ExecuteStoreQuery沿AsQueryable....我真的不想兑现对整个结果集,因为我会兑现只有10结果分页 …
c# sql-server entity-framework common-table-expression entity-sql
我有一个Entity SQL查询:
SELECT VALUE t FROM MyEntities AS t
WHERE t.Name = @p OR (@p IS NULL AND t.Name IS NULL)
Run Code Online (Sandbox Code Playgroud)
我可以执行如下查询:
var results = context.CreateQuery<WorkflowInstance>(
query, new ObjectParameter("p", name)).ToList();
Run Code Online (Sandbox Code Playgroud)
但是,如果'name'变量为null,那么我得到System.ArgumentNullException.所以如果名称为null,我也尝试使用DBNull.Value,我得到以下异常:
捕获到System.ArgumentOutOfRangeException
消息=指定的参数类型"System.DBNull"无效.仅支持标量类型,例如System.Int32,System.Decimal,System.DateTime和System.Guid.
我想要参数化查询,其中空值也是可能的参数值.如何使用Entity SQL实现此目的?
.net entity-framework .net-4.0 entity-sql entity-framework-4
有没有办法可以查看我的Linq-to-entities查询使用EF框架生成的Entity Sql(eSQL)(即,不是本机SQL,而是eSQL,如果有意义的话?)
谢谢!
我找不到关于这些运算符的好的文档。有人可以提供一些使用示例并解释其作用吗?
我正在尝试进行一个查询,我将一个文本列(包含一个整数作为文本)转换为Int32.这是查询:
SELECT VALUE t FROM MyEntities AS t WHERE CAST(t.TextColumn AS Edm.Int32) > 5
Run Code Online (Sandbox Code Playgroud)
但是,我得到一个带有以下消息的System.Data.EntitySqlException:
找不到类型'Edm.Int32'.确保加载了所需的模式,并正确导入名称空间.近类型名称,第1行,第75列.
根据MSDN,Edm.Int32应该是有效类型.
有谁知道什么是错的?
编辑:
经过一些试验和错误,我发现以下工作:
SELECT VALUE t FROM MyEntities AS t WHERE CAST(t.TextColumn AS System.Int32) > 5
Run Code Online (Sandbox Code Playgroud)
MSDN中的示例是错误的吗?我觉得我在这里错过了一些东西......
我使用QueryBuilder如下:
var queryString = String.Format(
"SELECT VALUE e FROM Entity AS e WHERE e.EndDate {0} {1} ",
operator,
DateTime.Today.AddYears(1).ToString("d", DateTimeFormatInfo.InvariantInfo)
);
ObjectQuery<Entity> query = new ObjectQuery<Entity>(queryString, Context);
Run Code Online (Sandbox Code Playgroud)
请注意,我非常简化了这个示例,我的目标是在创建QueryBuilder实例之前将查询构建为字符串.(只要这是可能的)
我已经尝试了以下内容
...DateTime.Today.AddYears(1)...
...DateTime.Today.AddYears(1).ToString()...
...DateTime.Today.AddYears(1).ToString("yyy\MM\dd")...
Run Code Online (Sandbox Code Playgroud)
这都导致一个异常,说我要么无法将DateTime与String或Int32进行比较.
我开始问我这种方法是否可行......
我在asp .net格式中使用EntityDataSource,Gridview绑定到它.在entityDataSource中使用where子句:
Where="it.Name like '%@Name%'
Run Code Online (Sandbox Code Playgroud)
@Name 是一个参数:
<WhereParameters>
<asp:ControlParameter ControlID="TextBox1" Name="Name" PropertyName="Text" Type="String" />
</WhereParameters>
Run Code Online (Sandbox Code Playgroud)
但它不起作用.当我@Name用固定字符串更改它正常工作,如下所示:
Where="it.Name like '%ppp%'"
Run Code Online (Sandbox Code Playgroud) 我的代码:
public List<Book> GetBook(string NameField, object Value)
{
var queryESQL = @"select VALUE Book from Book
where Cast(Book." + NameField + " as string) like '%M%'";
var query = this.Entities.CreateQuery<Book>(
queryESQL);
return query.ToList();
}
Run Code Online (Sandbox Code Playgroud)
错误:
无法找到"字符串"类型.确保加载了所需的模式,并正确导入名称空间.近型名称,第2行,第51列.
更新:
新代码:
public List<Book> GetBook(string NameField, object Value)
{
var queryESQL = @"select VALUE Book from Book
where Cast(Book." + NameField + " as EDM.string) like '%M%'";
var query = this.Entities.CreateQuery<Book>(
queryESQL);
return query.ToList();
}
Run Code Online (Sandbox Code Playgroud)
错误:
Type 'EDM.string' could not be found. Make sure …Run Code Online (Sandbox Code Playgroud) 我使用 c# 和 ef4。
我有一个带有两个属性的实体的模型int Id和string Title.
如果 Id 和 Title 存在于 DataSource 中ESQL,我需要编写一个查询return bool TRUE。请注意,Id 是我的数据存储中的主键。
知道怎么做吗?
entity-sql ×13
entity-framework ×10
c# ×4
.net ×3
linq ×3
sql-server ×2
.net-4.0 ×1
asp.net ×1
c#-4.0 ×1
gridview ×1
linq-to-sql ×1
sql ×1
sql-like ×1