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();