【问题标题】:Linq to hibernate common functionLinq休眠常用功能
【发布时间】:2017-10-22 12:51:45
【问题描述】:

有没有办法以某种方式封装像这样的重复投影方法: 我有具有属性 title_before、title_after、first_name、surname 的主题实体。现在我需要重复连接字符串以获得每个 linq 表达式中的主题名称。我想将它重构为表达式函数之类的东西,所以我只需在我的实体上调用 GetName() 并将其转换为 sql。这可能吗?也许它不仅是 nhibernate,而且也是对实体的 linq。 感谢您的回答。

【问题讨论】:

  • 您需要在数据库端执行此操作吗?如果不只是在您投影到的对象上有一个属性,那就是名称,并将其定义为名字和姓氏。如果您在数据库端需要它,请在您的表上创建一个派生列 Name 并将其映射到对象上的 Name 属性。
  • 我不允许在数据库端做任何逻辑
  • 你需要吗?您是在处理必须在数据库上发生的事情,还是只是检索和显示它?
  • 只显示数据
  • 如果您需要将作为 SQL 的一部分执行的性能优势,这 (weblogs.asp.net/ricardoperes/…) 可能值得探索。

标签: c# .net linq nhibernate linq-to-entities


【解决方案1】:

因为你只需要显示它,你可以用一个属性来做

public class OriginalClass
{
     public string first_name { get; set; }
     public string surname { get; set; }

     // other properties
}

然后你的目标类

public class TargetClass
{
    public string FirstName { get; set; }
    public string Surname { get; set; }
    public string Name => $"{FirstName} {Surname}";
}

然后用 select 投影到里面

var results = context.OriginalClasses.Select(
   oc => new TargetClass
   {
       FirstName = oc.first_name,
       Surname = os.surname,
   });    

然后在显示时仅引用名称,您将获得该值。只是不要在针对 IQueryable 的表达式中使用它,因为它没有数据库映射。

如果您有一堆要投影到的类,您可以创建一个 IHaveName 接口并针对它编写一个 GetName() 扩展方法。

【讨论】:

  • 我不想检索所有额外的字段(它不仅仅是名字姓氏,其中有 5 个,我还需要对它们执行 isnull )然后转换为 ienumarable。我想要一个通用函数,它可以扩展为在 sql server 中执行的表达式。我问有没有办法不干。
  • 你能编辑你的问题,用一些示例代码说出你真正想问的问题吗?我只能回答你问的问题,不能读懂你的想法。也许你想要一个映射工具来定义你的投影并重复使用它,但我不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 2017-01-17
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
相关资源
最近更新 更多