【问题标题】:Execute String as a Linq将字符串作为 Linq 执行
【发布时间】:2013-04-09 12:50:36
【问题描述】:

有没有办法可以将字符串作为 Linq 执行? 我有一个 dynamci 查询,为此我必须将 Linq 表达式转换为字符串,然后附加具有一些条件查询的字符串 bulider。 所以整个表达式现在是字符串。 现在如何执行这个字符串? 我应该再次将此字符串转换为 Linq 吗? 如何进行?

 StringBuilder sb = new StringBuilder();
 if (InstId != String.Empty)
 {
     sb.Append("application.Id ==" + InstId);
 }
 if (BId != String.Empty)
 {
     sb.Append("&& application.BId ==" + BId);
 }
 if (CId != String.Empty)
 {
     sb.Append("&& application.CId ==" + CId);
 }

String query=("from tables in context.Application .........
........join .........."+sb);

var q1=query;

现在如何执行这个q1?

【问题讨论】:

  • 您有什么特殊原因想要将其构建为字符串?在不使用字符串表示的情况下执行此操作会更高效、更安全 (IMO)。
  • 好吧,我提到了因为我必须在 where 子句中附加一些条件,所以我必须使用字符串生成器。
  • 您可以在不使用字符串的情况下构建 LINQ 查询。您在需求方面显示的所有内容绝对可以在不使用字符串表示的情况下完成。
  • 如果 Id 为空,我有不同的选择标准(因为我将它们作为字符串发送),所以每次我的查询都会改变。这只是一个示例,我将不得不执行它。
  • 同样,none 这会阻止您在不使用字符串的情况下动态构建查询。 Marcin 的回答是前进的方向。我敢肯定,从长远来看,引入字符串转换只会带来痛苦。

标签: linq c#-4.0 dynamic


【解决方案1】:

你不需要StringBuilder

var query = context.Application;

if (InstId != String.Empty)
{
    query = query.Where(a => a.Id == InstId);
}
if (BId != String.Empty)
{
    query = query.Where(a => a.BId == BId);
}
if (CId != String.Empty)
{
    query = query.Where(a => a.CId == CId);
}

var items = query.Join(/* your join here */).ToList();

在调用ToList 或其他类似方法之前不会执行查询,因此您可以根据需要附加Where()

【讨论】:

  • 我的查询中有多个连接,然后我在连接的不同表中使用 where 子句中的条件。
  • 所以以类似的方式准备queryAqueryB等并加入他们。然后你也可以在连接的数据上添加另一个Where
  • :非常感谢,我也是这样做的,效果很好。
【解决方案2】:

虽然在很多情况下我不一定认为这是一个很好的做法,但有一个 Dynamic LINQ 库可以让您做到这一点。

一般来说,如果可能,我建议使用可以进行更严格类型检查的东西,例如@MarcinJuraszak 的响应或类似PredicateBuilder 类的东西。

【讨论】:

  • 我已经浏览了上述链接,但这并没有帮助,因为我的查询中有很多连接。
  • @ItiTyagi 加入会导致哪些具体问题?构建 Where 子句谓词将适用于单个表或连接表
  • 我可以通过上述方式解决这个问题,现在可以正常工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 2017-11-07
  • 2011-04-15
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
相关资源
最近更新 更多