【问题标题】:Include coded field value in LINQ query (EF 5)在 LINQ 查询中包含编码字段值 (EF 5)
【发布时间】:2013-11-21 21:30:36
【问题描述】:

不确定术语是否正确,但有没有办法在 Entity Framework 5 LINQ 查询中包含表中不存在的“编码字段”?

例如,在 SQL 中你可以这样做:

SELECT 'Ledger' AS type, (...) FROM table

这样查询结果就会包含一个名为“type”的字段,其值为“Ledger”。有没有办法在 LINQ 查询中做到这一点?

在你问为什么它必须在查询中之前,这是因为查询是多个表的联合,我需要指定数据来自哪个表。如果没有这个,我将需要分别查询每个然后合并它们。

【问题讨论】:

  • 你不应该将你的类设计基于数据库模式。特别是当您将对象传递到更高层时。
  • @P.Brian.Mackey 不是,我有一个用于报告的业务层类,我正在尝试将查询结果填充到其中。

标签: c# sql linq entity-framework


【解决方案1】:

是的,你完全可以做到这一点。

p.s.w.g 使用了一种叫做匿名类型的东西。基本上,您可以即时定义查询的结果。 正如您在他的回答中看到的那样,在表达式语法中,这看起来像 Select(r => new { type = "Ledger", ... });

在查询语法中是这样的:

from xxx in y
select new { type = "Ledger" };

在 new 之后,没有类/类型或任何东西。也没有定义类型。但它会自然编译为字符串。

另一方面,您可以为此定义一个自定义 ViewModel 类

public class CustomResultVM
{
   //ignoring getter and setter
   public int Id;
   public string type;
   public string name;
}

您的选择现在将是强类型的,如下所示:

Select(r => new CustomResultVM 
{ 
  Id = r.xxx,
  type = "Ledger", 
  Name = r.xxxx 
});

//query snytax
from xxx in y
select new CustomResultVM 
       {
          Id = r.xxx,
          type = "Ledger", 
          Name = r.xxxx 
       };

这两种方式都有效,这取决于您在任何给定时间点的需要。

【讨论】:

    【解决方案2】:

    当然可以。它看起来有点像这样:

    var results = dbContext.Table.Select(r => new { type = "Ledger", ... });
    

    或者如果你需要一个命名类型,这样的东西应该可以工作:

    public class UnionResult 
    {
        string Type { get; set; }
        ...
    }
    
    var results = dbContext.Table.Select(r => new UnionResult { Type = "Ledger", ... });
    

    【讨论】:

    • +1 因为这是他要求的。但是很难想象匿名类型是单体应用程序之外的正确解决方案。因为他们不能被退回。
    • @P.Brian.Mackey 够公平的。我已经更新了我的答案以包含一个命名类型作为替代。
    • @ p.s.w.g.这使得我们两个。我明确回答了自己,因为我认为,扩展您的答案是个好主意
    • 谢谢,我希望我能将两者都标记为答案。我不敢相信我没有想到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2011-01-23
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多