我正在创建一个具有服务层(WCF 网站)和 Silverlight 4 客户端的应用程序。 RIA 服务不是一种选择,因此我们创建中间类来来回传递。为了这个问题的目的,我们假设我来回传递美味Food
对象。
public class FoodData
{
public int Id { get; set; }
public string Name { get; set; }
public Tastyness TastyLevel { get; set; }
}
EF 模型本质上是同一个类,一个包含三个基本字段的表(Tastyness 是一个 int,对应于我们的枚举 Tastyness)。
我发现自己在进行实体框架查询时经常使用这种语句:
public List<FoodData> GetDeliciousFoods()
{
var deliciousFoods = entities.Foods
.Where(f => f.Tastyness == (int)Tastyness.Delicious)
.ToList() // Necessary? And if so, best performance with List, Array, other?
.Select(dFood => dFood.ToFoodData())
.ToList();
return deliciousFoods;
}
如果没有 .ToList() 调用,我会收到有关 LINQ 无法将自定义方法转换为等效查询的异常,这是我理解的。
我的问题是关于致电.ToList()之前。选择(...)使用自定义扩展将我们的对象转换为 Food 对象的 POCO 版本。
这里是否有更好的模式可以执行,或者甚至可能是 .ToList() 的更好替代方案,它可能性能更高,因为我实际上并不需要 List<..> 结果的功能。
使用时出现的问题ToList
or AsEnumerable
是你实现整个实体并支付修复费用。如果你想要最好的 SQL 只返回所需的字段,那么你应该直接投影而不是使用.ToFoodData()
:
var deliciousFoods = entities.Foods
.Where(f => f.Tastyness == (int)Tastyness.Delicious)
.Select(dFood => new FoodData
{
Id = dFood.Id,
Name = dFood.Name,
TastyLevel = (Tastyness)dFood.Tastyness
});
强制转换为枚举可能会出现问题。如果是这样,请通过匿名类型:
var deliciousFoods = entities.Foods
.Where(f => f.Tastyness == (int)Tastyness.Delicious)
.Select(dFood => new FoodData
{
Id = dFood.Id,
Name = dFood.Name,
TastyLevel = dFood.Tastyness
})
.AsEnumerable()
.Select(dFood => new FoodData
{
Id = dFood.Id,
Name = dFood.Name,
TastyLevel = (Tastyness)dFood.TastyLevel
});
如果您检查生成的 SQL,您会发现它更简单,并且您无需支付将对象修复到 ObjectContext 中的成本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)