我正在使用 Dynamic Linq 作为应用内报告工具的后端,我遇到了一个问题,我无法解决我必须访问具有 1:M 关系的表的问题。
我的简化数据结构是这样的:
如果我在标准 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() 方法。我发现的最接近的东西是动态 Linq 连接扩展方法,我可能不得不考虑使用它,但我觉得动态 select() 会很麻烦。
编辑2:
根据霍根的建议,我已经做到了这一点:
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