首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Linq2 sql转换为TSQL

如何将Linq2 sql转换为TSQL
EN

Stack Overflow用户
提问于 2009-09-09 03:23:21
回答 3查看 359关注 0票数 0

当您使用构造函数将Linq2sql对象转换为域对象时,linq2sql似乎不知道如何构造TSQL。例如:

代码语言:javascript
复制
from c in db.Companies
select new Company (c.ID, c.Name, c.Location).Where(x => x.Name =="Roy");

但是当使用可设置的属性时,这是可以的。

代码语言:javascript
复制
from c in db.Companies
select new Company { ID = c.ID, Name = c.Name, Location = c.Location }.Where(x => x.Name =="Roy");

我不想让这些属性是可设置的。我如何才能做到这一点?有没有人能就Linq2SQL如何转换成TSQL提供一些思考的素材?提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-09 06:01:30

这可能与L2S解析表达式的方式有关-它可以解析对象初始化器表达式,但不能解析构造函数表达式。基本上,L2S的工作方式是以any LINQ provider does的方式解析linq表达式,然后将结果转换为SQL。

您可以通过首先将其转换为IEnumerable来实现您想要的效果,这样您就可以自由地使用LINQ to Objects了。在您给出的示例中,这是微不足道的,但让我们将其推广到具有更复杂where子句的情况:

代码语言:javascript
复制
var companyData =
    from c in db.Companies
    where c.Name.StartsWith("Roy")
    select new { c.ID, c.Name, c.Location };

var companies =
    from c in companyData.AsEnumerable()
    select new Company(c.ID, c.Name, c.Location);
票数 1
EN

Stack Overflow用户

发布于 2009-09-09 03:27:45

第一个查询是不正确的,因为from语句将返回公司实体的集合。要只得到一个公司,您需要将第一个语句更改为:

代码语言:javascript
复制
Company c = (from c in db.Companies where c.ID = someId select c).First();

第二条语句隐式地执行where语句。

我建议您在执行第二个查询时运行TSQL ,以查看实际用作语句的是什么。

票数 0
EN

Stack Overflow用户

发布于 2009-09-09 06:46:48

它不能翻译涉及构造函数的查询,因为它不知道构造函数应该做什么。它有属性的字段映射,但你的构造函数绝对可以做任何事情--为什么它要尝试事后猜测呢?

目前还不清楚将属性设为只读对于L2S实体类的目的是什么-通过删除对象并重新创建一个具有相同主键但具有新属性值的新对象,可以很容易地绕过这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1397394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档