0

当您使用构造函数将 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 的思考吗?提前致谢!

4

3 回答 3

1

这可能与 L2S 解析表达式的方式有关——它可以解析对象初始化表达式,但不能解析构造函数表达式。基本上,L2S 的工作方式是像任何 LINQ 提供程序一样解析 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);
于 2009-09-09T06:01:29.957 回答
0

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

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

第二个语句隐式执行 where 语句。

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

于 2009-09-09T03:27:44.517 回答
0

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

目前尚不清楚将属性设置为只读的目的对于 L2S 实体类的目的是什么——通过删除对象并重新创建一个具有相同主键但具有新属性值的新对象,可以轻松规避它。

于 2009-09-09T06:46:48.460 回答