我正在创建一个带有服务层(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或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 });