Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何动态地指定不同的表名来调用LINQtoEntities(EF4)查询?_Linq_Dynamic_Entity Framework 4 - Fatal编程技术网

如何动态地指定不同的表名来调用LINQtoEntities(EF4)查询?

如何动态地指定不同的表名来调用LINQtoEntities(EF4)查询?,linq,dynamic,entity-framework-4,Linq,Dynamic,Entity Framework 4,我有一堆表,它们都有一个名为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.TableOn

我有一堆表,它们都有一个名为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

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

您可以创建一个以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类级属性,还是将它们作为函数的参数进行赋值

经过一些修改后,我能够实现这一点-我必须使用内置的动态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);       
        }
}

您可能想考虑使用实体SQL和DATDATA记录来记录未知的结果类型。有关如何使用实体SQL的一些想法,请参见中的实体SQL示例。

您是在使用/谈论Linq to SQL还是关于实体框架-选择一个!这是EF,但在这种情况下,这有关系吗?这是linq对SQL数据库的挑战。如果我错了,请纠正我的错误。Linq-to-SQL是一个单独的OR映射器-它是由C团队编写的,或多或少是为了证明Linq可以做什么。EF支持称为LINQ to实体的LINQ。所以Linq to SQL和EF是两个独立的、密切相关的东西-但它们是不同的产品/不同的位。这是一个很好的答案,但我在s.ResourceID上得到了一个错误,因为EntityType上没有这样的属性-知道如何解决这个问题吗?EntityType只是您正在使用的实体类型的占位符。在您的代码中,您在dc.TableOne中从s选择了s.ResourceId,所以我使用了select语句。您如何调用该函数?