使用字符串动态创建(LLBLGen)Linq查询

我们需要生成在编码(设计时)期间100%未知的LINQ查询。 这是因为我们的框架中提供了逻辑,它与任何数据项目完全分开。 对于数据,我们使用LLBLGen生成的数据访问代码。

通常通过使用我们指定给框架(而不是引用)的DLL上的调用,我们可以创建代码来检索数据。 但是现在我们需要通过linq做到这一点。 我们怎么能创建一个像这样的查询:

var q = from customer in m.Customer select new { customer.Number, customer.City, customer.CountryEntity.Name }; 

仅来自字符串。 我们将有一个名为“customer”的字符串,因此我们知道必须从Customer检索。 然后我们会有一个包含我们想要检索的字段名的字符串[]。 如您所见,这些列可能包含复杂类型(相关字段)。

任何建议,特别是与LLBLGen结合使用,都会很棒!

谢谢,加布

我不确定这是否正是您所寻找的,但Scott Gu在他的博客上发布了关于使用动态LINQ的post。 http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

它可能无法满足您的所有需求,但它可能会让您获得一些好处。

编辑。 我只是看了一下Scott Gu的一些示例代码,发现它可以做你需要的选择部分。 示例(这是Scotts代码):

 Dim query = db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10). _ OrderBy("CompanyName"). _ Select("New(CompanyName as Name, Phone)") 

如您所见,底部位具有动态选择。

另外,为了解决动态知道在运行时查询哪个对象的问题,你可以这样:

  Sub query(Of T)(ByVal Myobject As IQueryable(Of T)) Dim i = Myobject.Select("New(customer.Number)") End Sub 

然后,您可以在从数据库中读取名称后进行一些切换,如下所示:

 Sub PassIt() Dim name = "customer" Select Case name Case "customer" query(m.Customer) End Select End Sub 

希望这可以帮助。 注意! 做最后一部分(passit方法)会有更好的方法,但是到了早上才能想到它。

对不起答案在VB中我应该在C#中完成它