c# - Dynamic Linq - 连接具有一对多关系的表

标签 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 的评论 - 我为什么不使用连接:报告系统是动态的,选择语句可能会或可能不会连接到 Table_B(或者确实多次连接到 Table_B),因此连接必须是可选的。我的另一个问题是,与 Select 方法不同,在 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

最佳答案

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

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); 

关于c# - Dynamic Linq - 连接具有一对多关系的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17567636/

相关文章:

c# - 如何使用 Xamarin iOS 中的默认音频播放器播放流式音频文件

c# - 来自 ReadOnlyCollection<T> 的对象 []

linq - 如何在 LINQ to Entities 中执行方法

c# - 序列包含多个元素 - 而它应该包含多个

c# - 如何在 C# 中获取 CPU 速度和总物理内存?

c# - 代码在其所在表单被关闭并处理后执行

c# - 加速简单的 LINQ 查询

mysql - SQL 连接 2 个表 - 在第二个连接的列上排序不同的结果

Mysql连接查询优化

python - 具有多个连接的 Django ORM 查询