如何调用Linq-to-Entities(EF4)查询动态指定不同的表名?

时间:2011-10-20 18:21:23

标签: 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.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: - ))

3 个答案:

答案 0 :(得分:3)

您可以创建一个以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类级属性,或者将它们作为参数传递给函数

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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