linq – 实体框架首先选择没有.ToList()的新POCO

前端之家收集整理的这篇文章主要介绍了linq – 实体框架首先选择没有.ToList()的新POCO前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建一个带有服务层(WCF网站)和Silverlight 4客户端的应用程序. RIA服务不是一个选择,所以我们创建中介类来传递.为了这个问题的目的,我们假设我来回传统美味食物.
public class FoodData
{
  public int Id { get; set; }
  public string Name { get; set; }
  public Tastyness TastyLevel { get; set; }
}

EF模型基本上是同一个类,一个有三个基本字段的表(Tastyness是一个对应于我们的枚举Tastyness的int).

进行Entity Framework查询时,我发现自己使用这种语句很多:

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无法将自定义方法转换为等效的查询,据了解.

我的问题是关于在.Select(…)之前使用自定义扩展名调用.ToList()来将我们的对象转换为Food对象的POCO版本.

有没有更好的模式在这里做,或者甚至可能更好的替代.ToList()可能会更加性能,因为我不真的要求列表的功能.结果.

解决方法

使用ToList或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,TastyLevel = dFood.Tastyness
                                  })
                             .AsEnumerable()
                             .Select(dFood => new FoodData
                                  {
                                      Id = dFood.Id,TastyLevel = (Tastyness)dFood.TastyLevel
                                  });

如果您检查生成sql,您将看到它更简单,并且您不需要将对象修复到ObjectContext中.

猜你在找的MsSQL相关文章