【问题标题】:How can I call a Linq-to-Entities (EF4) query specifying a different table name dynamically?如何调用 Linq-to-Entities (EF4) 查询动态指定不同的表名?
【发布时间】:2011-10-22 02:23:44
【问题描述】:

我有一堆表,它们都有一个名为 ResourceID 的字段,这些字段是从外部进程填充的。我想遍历每个表并根据主列表验证该 ID。代码简单但重复:

var resList = (from r in dc.ResourceMasterEntities select r.ResourceId).ToList();
var res = (from rs in resList select (int?)rs).ToList();

    var stage = (from s in dc.TableOne select s.ResourceId).ToList();
    foreach (var invalidResourceID in stage.Except(res).ToList())
    {
        errList.Add("Bad ID found:" + invalidResourceID );
    }

    stage = (from s in dc.TableTwo select s.ResourceId).ToList();
    foreach (var invalidResourceID in stage.Except(res).ToList())
    {
        errList.Add("Bad ID found:" + invalidResourceID );
    }

    // more of the same with different tables

我想创建一个函数,我可以在其中传递表的名称(TableOneTableTwo 等),而不必编写所有这些重复代码。这可以用Linq完成吗? (最好不要使用ExecuteQuery :-))

【问题讨论】:

  • 您是在使用/谈论 Linq-to-SQL 还是在谈论 Entity Framework - 选择一个!
  • 它是 EF 但在这种情况下它重要吗?它是针对 SQL 数据库的 linq。如果我错了,请纠正我。
  • Linq-to-SQL 是一个单独的 OR 映射器 - 它是由 C# 团队编写的,或多或少是作为 LINQ 功能的“概念证明”。 EF 支持 LINQ - 称为 Linq-to-Entities。所以 Linq-to-SQL 和 EF 是两个独立的、密切相关的东西——但它们是不同的产品/不同的位。

标签: linq dynamic entity-framework-4


【解决方案1】:

您可以创建一个将 IQueryable 作为参数的函数。

函数如下所示:

  private void CheckTable(IQueryable<EntityType> table)
  {
      var stage = (from s in table select s.ResourceId).ToList();
      foreach (var invalidResourceID in stage.Except(res).ToList())
      {
          errList.Add("Bad ID found:" + invalidResourceID);
      }
  }

  // Execute the function like:
  CheckTable(dc.TableOne);

您可以选择是制作 errList 和 res 类级别的属性,还是将它们作为参数传递给函数

【讨论】:

  • 这是一个很好的答案,但我在 s.ResourceID 上收到一个错误,因为 EntityType 上没有这样的属性 - 知道如何解决这个问题吗?
  • EntityType 只是您正在使用的实体类型的占位符。在您的代码中,您做了一个(从 dc.TableOne 中的 s 选择 s.ResourceId),所以我使用了该选择语句。你是如何调用函数的?
【解决方案2】:

通过一些修改,我能够让它工作 - 我必须使用内置的动态 linq 来选择我想要的属性。

private void CheckTable(System.Data.Objects.ObjectSet<EntityType> table)   
{
        var records = table.Select("BusinessEntityNbr").ToList();
        var values = (from r in records select (int?)r[0]).ToList();

        foreach (var invalidResourceID in values.Except(res).ToList())       
        {
           errList.Add("Bad ID found:" + invalidResourceID);       
        }
}

【讨论】:

    【解决方案3】:

    您可能需要考虑将实体 SQL 和 DbDataRecord 用于未知结果类型。有关如何使用 Entity SQL 的一些想法,请参阅http://archive.msdn.microsoft.com/EFQuerySamples 中的 Entity SQL 示例。

    【讨论】:

      猜你喜欢
      • 2013-05-02
      • 1970-01-01
      • 2012-10-25
      • 2017-02-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 2021-12-09
      相关资源
      最近更新 更多