gpt4 book ai didi

linq-to-sql - 如何将 Lazy 传递到我的投影中?

转载 作者:行者123 更新时间:2023-12-01 04:12:17 25 4
gpt4 key购买 nike

我的 Vehicle类型:

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;
}
}
}

我想使用构造函数在 L2S 中投影我的类型,并将某些映射作为委托(delegate)传递,以便它们在内存中进行评估,而不是 L2S 试图将它们转换为 SQL。

在下面的示例中,我试图将 SQL 中的“vehicle.Name”值映射到我的 Vehicle 上的两个属性上。类型:“名称” string属性和“NameFromDelegate” string属性(封装了 Lazy<string> )。

我希望证明我是否将“vehicle.Name”传递给 string 对 L2S 没有任何影响ctor 参数或发送到 Lazy<string> ctor 参数。但也许确实如此:
enter image description here

我不明白为什么需要从 string 转换至 Func<string> .想法?

堆栈跟踪供引用:
   at System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider)
at System.String.System.IConvertible.ToType(Type type, IFormatProvider provider)
at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
at System.Data.Linq.DBConvert.ChangeType(Object value, Type type)
at Read_Vehicle(ObjectMaterializer`1 )
at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at DelegateQueries.Models.VehicleRepoWithDelegates.GetAll() in %path%\DelegateQueries\Models\VehicleRepoWithDelegates.cs:line 26
at DelegateQueries.Tests.RepoTests.VehicleRepo_CanReturn_NameFromDelegateProp_InLinq_WithDelegate() in %path%\DelegateQueries\DelegateQueries.Tests\RepoTests.cs:line 31

最佳答案

这似乎可以解决问题:

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

但你不能这样做:
var r = from veh in ctx.vehicles
select new Func<int>(() => veh.id);
r.ToList();

L2S 似乎将 lambda 表达式的创建视为值赋值,而不是方法调用,并试图将值从 db 转换为它。我说这是一个错误,因为这适用于 linq to objects。

关于linq-to-sql - 如何将 Lazy<T> 传递到我的投影中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5470113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com