linq 2 sql如何转换为TSQL

时间:2009-09-09 03:23:21

标签: c# linq-to-sql domain-driven-design linq-to-objects ddd-repositories

在将linq2sql对象转换为带有构造函数的域对象时,Linq2sql似乎不知道如何构造TSQL。如:

from c in db.Companies
select new Company (c.ID, c.Name, c.Location).Where(x => x.Name =="Roy");

但是当使用可设置属性时,它会没问题。

from c in db.Companies
select new Company { ID = c.ID, Name = c.Name, Location = c.Location }.Where(x => x.Name =="Roy");

我不想允许这些属性可设置。我怎样才能做到这一点?任何人都可以提供关于linq 2 sql如何被翻译成TSQL的思考?提前谢谢!

3 个答案:

答案 0 :(得分:1)

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

您可以通过首先将其转换为IEnumerable来实现您想要的功能,因为您可以自由使用LINQ to Objects。在您给出的示例中,这是微不足道的,但让我们概括为具有更复杂的where子句的情况:

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 :(得分:0)

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

Company c = (from c in db.Companies where c.ID = someId select c).First();

第二个语句隐含地使用where语句。

我建议您在执行第二个查询时运行 SQL Profiler ,以查看实际用作TSQL语句的内容。

答案 2 :(得分:0)

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

目前尚不清楚使属性只读对于L2S实体类的目的是什么 - 通过删除对象并重新创建具有相同主键但新属性值的新对象,可以避免这种情况。 / p>