【问题标题】:Creating an anoymous object in a class for linq query in C#在类中为 C# 中的 linq 查询创建匿名对象
【发布时间】:2021-11-14 01:43:18
【问题描述】:

我需要运行大量的 linq 查询,并且在构造函数中运行它们对我有好处。

我有一个类似的查询:

var query = _cctDBContext.table1
                         .Select(b => new {
                             b.Id, 
                             b.SegmentId, 
                             b.Response1, 
                             b.ResponseDescription, 
                             b.ResponseGuidance})
                         .Where(b => b.SegmentId == SegmentId)

我知道这是匿名的,但我怎么能在构造函数中执行呢?

像这样:

public class SegmentData
{
    private readonly sqldbCLSegImportUKSATPTestContext _clDBContext;
    private readonly sqldbCCTUKSATPTestContext _cctDBContext;
    private readonly IList<Response> ResponseCCTtoAuditResponse;

    public SegmentData(
        sqldbCLSegImportUKSATPTestContext clDBContext, 
        sqldbCCTUKSATPTestContext cctDBContext)
    {
        _clDBContext = clDBContext;
        _cctDBContext = cctDBContext;

        // AUDIT RESPONSE PAGE 15
        ResponseCCTtoAuditResponse = _cctDBContext.Response
                                                  .Select(b => new { 
                                                      b.ResponseId, 
                                                      b.SegmentId, 
                                                      b.Response1, 
                                                      b.ResponseDescription, 
                                                      b.ResponseGuidance})
                                                  .Where(b => b.SegmentId == 5)
                                                  .ToList();
    }
}

我尝试将IList 指定为表的实体框架类的名称,但这不起作用。任何帮助都会很棒

【问题讨论】:

  • 你为什么还要使用匿名对象?如果您需要将信息从某个地方传递到另一个地方,您应该为这些东西提供字符串名称,以便其他人更容易理解您的代码。创建一个包含所选信息的类,并为每个项目创建该类的实例。
  • 使用匿名对象不是个好方法吗?在将数据传递给其他方法/页面/位置时,您可以为此创建一个类。
  • 我明白了,也许你可以给我一个例子,因为类已经由 EF Core 创建。我将 linq 作为 ToList() 返回 - 所以一点帮助会很棒。
  • 而不是写new { b.ResponseId, b.SegmentId, b.Response1, b.ResponseDescription, b.ResponseGuidance},只需创建一个具有这些属性的类,然后写new MyClass { ResponseId = b.ResponseId, ... }
  • 我正在尝试在构造函数中执行我的 linq。我将每个表作为一个类(因为 EF 核心无论如何都会创建它们)。我可以用 Var = all day 来做,但这似乎不是最好的方法。我需要找到一种在构造函数中执行 linq 的方法。任何人都可以为我提供一个体面的链接或帮助吗?它不必是匿名的。

标签: c# linq entity-framework-core


【解决方案1】:

出于某种原因,您正专注于在构造函数中运行此查询。这与它无关。

您的查询正在创建一个匿名类的列表,然后尝试将其分配给一个命名的、预定义的类 Response 的列表。这不会起作用,因为它们是不同的。

不是创建匿名类型,而是在查询中命名类型

ResponseCCTtoAuditResponse = _cctDBContext.Response.
          Select(b => new Response(){ ResponseId = b.ResponseId, 
                                      SegmentId = b.SegmentId,
                                      Response1 = b.Response1,
                                      ResponseDescription = b.ResponseDescription, 
                                      ResponseGuidance = b.ResponseGuidance}
                 ).Where(b => b.SegmentId == 5).ToList();

这假设您选择的类确实具有与您似乎在说的 Response 类相同的字段。或者使用其他形式的查询:

ResponseCCTtoAuditResponse = (from r in cctDBContext.Response
                              where r.SegmentId == 5
                              select r).ToList<Response>();

【讨论】:

  • 这是完美的,所以现在我可以在构造函数触发时执行查询......我现在确切地看到它是如何工作的以及我做错了什么......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多