C# 在LINQ查询中包括编码字段值(EF 5)

C# 在LINQ查询中包括编码字段值(EF 5),c#,sql,linq,entity-framework,C#,Sql,Linq,Entity Framework,不确定术语是否正确,但是否有办法在Entity Framework 5 LINQ查询中包含表中不存在的“编码字段” 例如,在SQL中,可以执行以下操作: SELECT 'Ledger' AS type, (...) FROM table 因此,查询结果包括一个名为“type”的字段,其值为“Ledger”。在LINQ查询中是否有这样做的方法 在您询问为什么必须在查询中之前,这是因为查询是多个表的并集,我需要指定数据来自哪个表。如果没有这个,我需要分别查询每一个,然后合并它们。当然可以。它看起来

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

例如,在SQL中,可以执行以下操作:

SELECT 'Ledger' AS type, (...) FROM table
因此,查询结果包括一个名为“type”的字段,其值为“Ledger”。在LINQ查询中是否有这样做的方法


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

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

var results = dbContext.Table.Select(r => new { type = "Ledger", ... });
from xxx in y
select new { type = "Ledger" };
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 
       };
或者,如果您需要一个命名类型,类似这样的方法应该可以工作:

public class UnionResult 
{
    string Type { get; set; }
    ...
}

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

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

var results = dbContext.Table.Select(r => new { type = "Ledger", ... });
from xxx in y
select new { type = "Ledger" };
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 
       };
或者,如果您需要一个命名类型,类似这样的方法应该可以工作:

public class UnionResult 
{
    string Type { get; set; }
    ...
}

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

是的,你完全可以做到

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

在查询语法中,它如下所示:

var results = dbContext.Table.Select(r => new { type = "Ledger", ... });
from xxx in y
select new { type = "Ledger" };
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 
       };
在new之后,没有类/类型或任何东西。两者都没有定义类型。但它会自然地编译为字符串

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

public class CustomResultVM
{
   //ignoring getter and setter
   public int Id;
   public string type;
   public string name;
}
您的select现在将是强类型的,如下所示:

var results = dbContext.Table.Select(r => new { type = "Ledger", ... });
from xxx in y
select new { type = "Ledger" };
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 
       };

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

是的,您完全可以这样做

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

在查询语法中,它如下所示:

var results = dbContext.Table.Select(r => new { type = "Ledger", ... });
from xxx in y
select new { type = "Ledger" };
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 
       };
在new之后,没有类/类型或任何东西。两者都没有定义类型。但它会自然地编译为字符串

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

public class CustomResultVM
{
   //ignoring getter and setter
   public int Id;
   public string type;
   public string name;
}
您的select现在将是强类型的,如下所示:

var results = dbContext.Table.Select(r => new { type = "Ledger", ... });
from xxx in y
select new { type = "Ledger" };
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 
       };

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

您不应该将类设计基于数据库模式。特别是当您将对象传递到更高的层时。@P.Brian.Mackey不是,我有一个用于报表的业务层类,我正试图将查询结果填充到该类中。您不应该将类设计基于数据库架构。特别是当您将对象传递到更高的层时。@P.Brian.Mackey不是,我有一个报告的业务层类,我正试图将查询结果填充到其中。+1,因为这是他要求的。但是很难想象在单片应用程序之外,匿名类型是正确的解决方案。因为他们不能被归还。@P.Brian.Mackey很公平。我已经更新了我的答案,以包含一个命名类型作为替代项。@p.s.w.g.这使我们两个都是。我明确地回答了我自己,因为我认为,扩展你的答案是一个好主意。我希望我能把这两个都标记为答案。我真不敢相信我没有想到这一点。因为这是他要求的。但是很难想象在单片应用程序之外,匿名类型是正确的解决方案。因为他们不能被归还。@P.Brian.Mackey很公平。我已经更新了我的答案,以包含一个命名类型作为替代项。@p.s.w.g.这使我们两个都是。我明确地回答了我自己,因为我认为,扩展你的答案是一个好主意。我希望我能把这两个都标记为答案。真不敢相信我居然没想到这个。