动态Linq - 加入具有1对多关系的表

时间:2013-07-10 09:56:07

标签: c# linq join dynamic-linq

我正在使用Dynamic Linq作为应用内报告工具的后端,我遇到了一个无法解决的问题,即我必须访问具有1:M关系的表。

我的简化数据结构如下:

Database schema

如果我在标准Linq中查询它,我会将查询写为:

from a in context.Table_A
select new 
{
    a.RefNo,
    val = from b in a.Table_B
          where (b.A_ID == a.ID)
          where (b.code == "A0001"
          select(b.Value).FirstOrDefault()
}

这没有任何问题。但是,当我使用Dynamic Linq尝试查询时,我无法使联接起作用。

从下面的代码中你可以看到我所得到的但显然我不能使用“a”。以及查询中的“a.Table_B”引用。在此上下文中,我需要做些什么才能访问Table_B?

string select =  "new (Ref_No, 
                       val = from b in a.Table_B
                       where (b.A_ID == a.ID)
                       where (b.code == \"A0001\"
                       select(b.Value).FirstOrDefault()";

var results = context.Table_A.Select(select);

修改1:

回答@Hogan的评论 - 为什么我不使用join:报告系统是动态的,select语句可能会也可能不会加入Table_B(或者确实多次加入Table_B)所以加入必须是可选的。我的另一个问题是,与Select方法不同,我可以将字符串作为参数传递(允许我很容易地使其动态化),不能以这种方式调用Join()方法。我发现最接近的是dynamic Linq join extention method,我可能需要考虑使用它,但我觉得动态select()会很麻烦。

编辑2:

根据Hogan的建议,我已经做到了这一点:

delegate string searchTableA(Table_A a);

public void Search()
{
   ....

   searchTableA sel = (a) =>
   {
      return (from b in context.Table_B
      where (b.A_ID == a.ID)
      select (b.Value)).FirstOrDefault();
   };

   var res = context.Table_A.Select(sel);
}

这会出错:'System.Data.Entity.DbSet<TestDynamicLinqJoins.Table_A>' does not contain a definition for 'Select' and the best extension method overload 'System.Linq.Dynamic.DynamicQueryable.Select(System.Linq.IQueryable, string, params object[])' has some invalid arguments

1 个答案:

答案 0 :(得分:0)

很难给出确切的代码,因为我不知道你的元素的类型,但这样的东西可以使用委托工作。

delegate string searchTableA(elementType a);

searchTableA sel = (a) => 
  {
     return from b in a.Table_B
                   where (b.A_ID == a.ID)
                   where (b.code == "A0001")
                   select(b.Value).FirstOrDefault();
  };

var results = context.Table_A.Select(sel);