代码之家  ›  专栏  ›  技术社区  ›  Gabriël

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

  •  2
  • Gabriël  · 技术社区  · 16 年前

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

    通常,通过在dll上使用invokes(我们指定给框架(而不是引用)),我们可以创建代码来检索数据。但现在我们需要Linq来做这个。我们如何创建这样的查询:

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

    仅从字符串。我们将有一个称为“客户”的字符串,因此我们知道必须从客户那里检索。然后我们将得到一个包含要检索的字段名的字符串[]。如您所见,这些列可能包括复杂类型(相关字段)。

    任何建议,特别是与llblgen结合使用,都是很好的!

    谢谢, 嘎布

    1 回复  |  直到 13 年前
        1
  •  1
  •   Nathan W    16 年前

    我不确定这是否正是你想要的,但是顾立伟在他的博客上有一篇关于使用动态LINQ的文章。 http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

    它可能不会做你需要的一切,但它可能会给你一些方法。

    编辑。我刚刚看了一下ScottGu的一些示例代码,发现它可以完成您需要的选择部分。示例(这是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写的。#