Linq to sql 我怎样才能通过一个懒惰的<;T>;在我的投影中?
车型年款Linq to sql 我怎样才能通过一个懒惰的<;T>;在我的投影中?,linq-to-sql,domain-driven-design,projection,lazy-evaluation,Linq To Sql,Domain Driven Design,Projection,Lazy Evaluation,车型年款车辆类型: public class Vehicle : EntityObject { private Lazy<string> _nameFromDelegate = null; private Lazy<IList<Component>> _components = null; public Vehicle(int id, string name, Lazy<string> nameFromDelegate,
车辆
类型:
public class Vehicle : EntityObject
{
private Lazy<string> _nameFromDelegate = null;
private Lazy<IList<Component>> _components = null;
public Vehicle(int id, string name, Lazy<string> nameFromDelegate, Lazy<IList<Component>> components)
: base(id)
{
this.Name = name;
this._nameFromDelegate = nameFromDelegate;
}
public string Name { get; private set; }
public string NameFromDelegate
{
get
{
return this._nameFromDelegate.Value;
}
}
public IList<Component> Components
{
get
{
return this._components.Value;
}
}
}
这似乎解决了问题:
static Lazy<T> Lazyfy<T>(T input)
{
return new Lazy<T>(() => input);
}
public IQueryable<Vehicle> Vehicles()
{
return from veh in ctx.vehicles
select new Vehicle(veh.id, veh.name, Lazyfy(veh.name), null);
}
static Lazy Lazyfy(T输入)
{
返回新的延迟(()=>输入);
}
公共交通工具()
{
从ctx车辆的车辆返回
选择新车(车辆id、车辆名称、懒散(车辆名称)、空);
}
更新您也可以这样做:
static Func<T> Functify<T>(T input)
{
return () => input;
}
public IQueryable<Vehicle> Vehicles()
{
return from veh in ctx.vehicles
select new Vehicle(veh.id, veh.name, new Lazy<string>(Functify(veh.name)), null);
}
静态功能(T输入)
{
返回()=>输入;
}
公共交通工具()
{
从ctx车辆的车辆返回
选择新车(车辆id、车辆名称、新车名称(功能(车辆名称)),空);
}
但你不能这样做:
var r = from veh in ctx.vehicles
select new Func<int>(() => veh.id);
r.ToList();
var r=来自ctx车辆中的车辆
选择新功能(()=>车辆id);
r、 托利斯特();
L2S似乎将lambda表达式创建视为值赋值,而不是方法调用,并试图将值从db转换为它。我是说这是一个bug,因为它在linq to对象上工作 您尝试进行的投影在使用内存集合时有效,因此我猜您在尝试投影到Func时发现了linq 2 sql错误。我想我明白您现在的意思了。。我真的不认为我是在“投射到一个
Func
”。我想我是个演员,为什么?为什么?为什么?为什么?请给我解释一下。我以前试过用包装纸,但可能就是没做对?是不是在欺骗L2S,使其不尝试将其转换为表达式?@cottsak请参阅我的更新,问题是L2S试图通过转换db中的值来创建Func,而不是将其视为方法调用并从db中传递参数。通过显式地将Func的创建转移到单独的方法,至少可以很容易地解决此错误。NHibernate中的linq提供程序可能会遇到完全相同的问题。疯狂。我认为将LINQ转换为对象是因为表达式没有被转换为SQL。我不知道;I don’我不认为这是L2S本身的一个“bug”,而仅仅是翻译失败——只是“无法翻译为SQL”异常并不是被提出的一个,也许是因为这个用例不是为Seen设计的??您可能是对的,L2S没有预见到这个特性,但是因为我们正在讨论一个投影,我认为思考的过程应该是:确定我们需要选择什么来创建投影,在投影表达式中找到可以通过sql转换优化的任何已知位,对于未知位,只需提供从字段到表达式的值。
var r = from veh in ctx.vehicles
select new Func<int>(() => veh.id);
r.ToList();