Linq to sql LINQ到SQL的转换

Linq to sql LINQ到SQL的转换,linq-to-sql,Linq To Sql,根据我将linq查询映射到域对象的方式,我会得到以下错误 成员“member”没有受支持的SQL转换 此代码导致错误: public IQueryable<ShippingMethod> ShippingMethods { get { return from sm in _db.ShippingMethods select new ShippingMethod( sm.ShippingMeth

根据我将linq查询映射到域对象的方式,我会得到以下错误

成员“member”没有受支持的SQL转换

此代码导致错误:

public IQueryable<ShippingMethod> ShippingMethods {
    get {
        return from sm in _db.ShippingMethods
               select new ShippingMethod(
                   sm.ShippingMethodID, 
                   sm.Carrier,
                   sm.ServiceName, 
                   sm.RatePerUnit, 
                   sm.EstimatedDelivery, 
                   sm.DaysToDeliver, 
                   sm.BaseRate, 
                   sm.Enabled
                );
    }
}
实例化对象的方式如何影响linq到sql的转换

谢谢
Ben

它尝试将整个linq查询映射到SQL,包括所有方法和属性调用。唯一的例外是对象初始值设定项语法(对于匿名命名类型)和自身映射到SQL的扩展方法(
.Count()


简而言之:不能在Linq to SQL或实体框架中使用非默认构造函数。

它尝试将整个Linq查询映射到SQL,包括所有方法和属性调用。唯一的例外是对象初始值设定项语法(对于匿名命名类型)和自身映射到SQL的扩展方法(
.Count()


简而言之:不能将非默认构造函数与Linq to SQL或实体框架一起使用。

这里最重要的问题是,您混合了谓词和投影语义

投影后(即使用
select
),使用
Where
扩展将不再安全,直到使用
ToList()
ToArray()
或类似工具将结果具体化。第二种情况恰好有效,因为投影是完全透明的-您所做的只是属性赋值,并且是对同一个类的赋值。构造函数不属于这一类;正如错误消息所说,SQL Server中没有构造函数调用的等效表示形式

你为什么要做这个投影呢?整个物业可替换为:

return _db.ShippingMethods.AsQueryable();

这里最重要的问题是混合了谓词和投影语义

投影后(即使用
select
),使用
Where
扩展将不再安全,直到使用
ToList()
ToArray()
或类似工具将结果具体化。第二种情况恰好有效,因为投影是完全透明的-您所做的只是属性赋值,并且是对同一个类的赋值。构造函数不属于这一类;正如错误消息所说,SQL Server中没有构造函数调用的等效表示形式

你为什么要做这个投影呢?整个物业可替换为:

return _db.ShippingMethods.AsQueryable();

我的代码可能不清楚,但我没有使用Linq对象。因此_db.ShippingMethods返回Linq.ShippingMethod,但我正在映射到MyModel.ShippingMethod。谢谢你的解释。我的代码可能不清楚,但我没有使用Linq对象。因此_db.ShippingMethods返回Linq.ShippingMethod,但我正在映射到MyModel.ShippingMethod。谢谢你的解释。如果我需要使用构造函数,我该怎么办?例如,我需要初始化对象的状态,这是使用持久化到数据库的枚举来完成的。因此,我需要将这个值传递给构造函数。谢谢你可以有一个构造函数,只是没有一个带参数的构造函数。初始化应该在无参数(=默认)构造函数中进行。好的,但我相信在分配属性值之前,使用上面的对象初始值设定项语法初始化会命中默认构造函数。因此,如果我需要根据上面映射的属性初始化一个状态属性,我必须添加某种初始化方法,并在映射完成后调用它。如果我需要使用构造函数,我该怎么办?例如,我需要初始化对象的状态,这是使用持久化到数据库的枚举来完成的。因此,我需要将这个值传递给构造函数。谢谢你可以有一个构造函数,只是没有一个带参数的构造函数。初始化应该在无参数(=默认)构造函数中进行。好的,但我相信在分配属性值之前,使用上面的对象初始值设定项语法初始化会命中默认构造函数。因此,如果我需要根据上面映射的属性初始化一个状态属性,我必须添加一些初始化方法,并在映射完成后调用它。
return _db.ShippingMethods.AsQueryable();