实体框架首先选择不带 .ToList() 的新 POCO

2024-04-15

我正在创建一个具有服务层(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(使用前将#替换为@)

实体框架首先选择不带 .ToList() 的新 POCO 的相关文章

  • 在 C# 中使用 LINQ 时函数求值超时

    我有以下代码 var deletedData from c in this DataSet Tables TableName1 AsEnumerable from deletedData1 in this DataSet Tables Ta
  • 实体框架 4.1 代码首先在数据库“master”中创建数据库权限被拒绝

    我使用 Entity Framework 4 1 创建了一个通用存储库项目 当作为现有项目添加到项目中时 它非常适合我的项目 但当仅作为 dll 引用时 它对它们不起作用 我收到这个错误 数据库 master 中的 CREATE DATAB
  • 是否可以在对Where 的调用中调用命名方法?

    我试图从 RedGate 的这本免费电子书中了解 Linq 的一些性能影响ftp support red gate com ebooks under the hood of net memory management part1 pdf f
  • 使用 List.Contains 方法为 LINQ 构建表达式树

    Problem 我正在重构一些LINQ查询我们的 Web 应用程序中的多个报告 并且我尝试将一些重复的查询谓词移至它们自己的中IQueryable扩展方法 以便我们可以将它们重新用于这些报告以及将来的报告 正如您可能推断的那样 我已经重构了
  • 升级到 Visual Studio 16.3.0 后,dotnet ef 命令不再起作用

    这种情况首先发生在家里 所以我想这可能是我家里的台式电脑的问题 但现在我回到工作岗位 我尝试升级并得到了同样的结果 升级前截图 升级 Visual Studio 后的屏幕截图 我得到的错误是 无法执行 因为找不到指定的命令或文件 造成这种情
  • MetadataException:无法加载指定的元数据资源

    突然间我不断收到MetadataException在实例化我生成的ObjectContext班级 App Config 中的连接字符串看起来正确 自上次工作以来没有更改 我尝试从底层数据库重新生成一个新模型 edmx 文件 没有任何更改 有
  • List、IList、IEnumerable、IQueryable、ICollection,哪个返回类型最灵活?

    我之前已经在这里看到过这个问题 但我不满意我理解的完整后果 问题是使用 linq to sql 返回的数据层应该使用什么返回类型以获得最大的灵活性和查询能力 这是我读过 发现的 IEnumerable 是有限的 只允许向前读操作 IEnum
  • 将许多表转换为 Excel 列

    我创建了用于文章审阅的网络应用程序 我有一个名为 Article 的表 每个表Article有一些ArticleReview Article ArticleId ArticleTitle NumberOfComment NumberOfVi
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 使用 LINQ。有两个不同的列表。如何识别不匹配的对象

    我有三门课 public partial class Objective public Objective this ObjectiveDetails new List
  • 如何查询多对多表(一个表的值成为列标题)

    给定此表结构 我想展平多对多关系 并将一个表的名称字段中的值设置为列标题 并将同一表中的数量设置为列值 目前可行的想法是将值放入字典 哈希表 中并用代码表示这些数据 但我想知道是否有 SQL 方法可以做到这一点 我还使用 Linq to S
  • 如何将存储过程中的值返回到 EF

    我试图通过 EF 调用存储过程并从存储过程中检索返回值 我用过this https stackoverflow com questions 6861737 executesqlcommand with output parameter an
  • 使用经度和纬度查找给定距离内的所有附近客户

    我有一个包含客户经度和纬度的数据库 我有一个搜索表单 用户将在其中输入日志 纬度 距离下拉列表包含 50 英里 100 英里 当用户单击搜索时 我想编写一个 linq 查询从数据库中获取此距离半径内的所有客户 如何使用 C 和 linq 来
  • 是否可以存根实体框架上下文和类来测试数据访问层?

    我熟悉用于测试 ASP NET MVC 应用程序中的控制器和业务逻辑的技术 我们的应用程序中的数据访问集中在松散耦合的特殊服务中 使用接口并通过实体框架与实际数据库一起使用 然而 随着 DAL 变得越来越复杂 隐藏数据库实现细节并为应用程序
  • 为什么 DbSet 不是协变的?

    我有一个工厂函数来返回DbSet Of IItemType 实际的返回类型始终是一个实现IItemType 例如DbSet Of CategoryType 我认为泛型支持协方差 并且此方法可以正常工作 但是当我尝试运行代码时出现异常 无法转
  • 学习实体框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Web API 的 ASP.NET MVC Core 控制器 PATCH 方法

    给定一个数据库表 Person 包含 3 列 Id 名字和姓氏 使用真实的 DbContext 时 ASP NET Core Web API MVC 控制器方法 PATCH 仅修改姓氏 看起来如何 我根本不知道如何实现它 并且找不到相关教程
  • EF数据库首先如何针对数据库更改更新模型?

    在班级图书馆Ado net Entity Data Model已生成 POCO 类 这些是第一次生成的 但数据库更改并未得到反映 在edmx图表右键单击并选择Update Model from Database显示新创建的表 但即使选择添加
  • LINQ:从类型 T 的列表中,仅检索某个子类 S 的对象

    给定一个简单的继承层次结构 人 gt 学生 教师 职员 假设我有一个人员列表 L 该列表中有一些学生 教师和工作人员 使用 LINQ 和 C 有没有办法编写一个只能检索特定类型人员的方法 我知道我可以做类似的事情 var peopleIWa
  • 使用 javascript/jquery 从数据库格式化日期的正确方法

    我正在调用包含日期时间数据类型的数据库 日期看起来像这样 2005 05 23 16 06 00 000 当用户从列表中选择某个项目时 我想在表格中显示它 我调用我的控制器操作并返回所有时间的 Json 并将它们放入表中 问题是日期完全错误

随机推荐