我们需要生成在编码(设计时)期间100%未知的LINQ查询。这是因为我们的框架中提供了逻辑,它与任何数据项目完全分开。对于数据,我们使用LLBLGen生成的数据访问代码。
通常通过使用我们在框架(而不是引用)中指定的DLL上的调用,我们可以创建用于检索数据的代码。但现在我们需要通过linq来做到这一点。我们怎么能创建一个像这样的查询:
var q = from customer in m.Customer
select new
{
customer.Number,
customer.City,
customer.CountryEntity.Name
};
仅限字符串。我们将有一个名为“customer”的字符串,因此我们知道必须从Customer检索。然后我们将有一个包含我们想要检索的字段名的字符串[]。如您所见,这些列可能包含复杂类型(相关字段)。
任何建议,特别是与LLBLGen结合使用,都会很棒!
谢谢, 加布
答案 0 :(得分:1)
我不确定这是否正是您所寻求的,但Scott Gu在他的博客上发布了关于使用动态LINQ的帖子。http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
它可能无法满足您的所有需求,但可能会让您获得一些好处。
EDIT。我只是看看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#
中完成