2008-10-29 54 views
2

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

正常情况下,通过对我们指定给框架(不是引用)的DLL调用,我们可以创建代码来检索数据。但是现在我们需要通过linq来做到这一点。我们如何创建一个查询如下:

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

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

任何建议,特别是与LLBLGen结合,将是伟大的!

感谢, 加布

+0

LINQ试图帮助你避免串并直接与一个类型安全的方式处理的对象。如果你不想要,那么你可能根本不需要LINQ。 – Hallgrim 2008-10-29 22:52:22

回答

1

我不知道这是否是你寻找什么,但斯科特谷在他的有关使用动态LINQ博客的一篇文章。 http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

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

编辑。我只是看看斯科特顾的一些示例代码,并发现它可以完成您需要的选择部分。示例(这是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#中都做到了

+0

我也发现了这一点......但它是我最需要的'选择'部分。不是过滤字段。不管怎么说,还是要谢谢你 – 2008-10-30 09:09:29