将linq查询创建为字符串

时间:2015-02-10 12:18:22

标签: c# string linq

我有一个包含linq查询的字符串,我有一个动态where子句也作为包含许多动态条件的字符串 这是我的where子句

string strWhereString = "where a.id==1 && a.name==\"something\"";

这是我的linq查询字符串:

var query = "from a in context.tblName "+strWhereString;

问题是如何运行此查询并从表中获取结果? 有没有办法做到这一点,或Linq不支持这个?

4 个答案:

答案 0 :(得分:6)

您正在寻找的内容类似于System.Linq.Dynamic

这将使您可以翻译如下的查询:

var query = from p in northwind.Products
                where p.CategoryID == 3 && p.UnitPrice > 3
                orderby p.SupplierID
                select p;

成:

var query = northwind.Products
                         .Where("CategoryID = 3 AND UnitPrice > 3")
                         .OrderBy("SupplierID");

这里也是一个很好的起点,它有一篇很好的博客文章和一些下载的例子。

Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)

答案 1 :(得分:2)

也许你使用linq静态方法会有更多的运气:

context.tblName.Where(a=>a.id==1 && a.name=="something")

这种方式很容易动态地添加where子句(或其他):

context.tblName..Where(a=>a.id==1 && a.name=="something").Where(a=>otherClause(a))

我不确定这是否真的是你正在寻找的,但我认为这是正确的方向。

答案 2 :(得分:2)

我还必须处理进行数据库搜索的动态条件。我提出了这个解决方案,而不是字符串解析或动态LINQ。 errorsOnlystartDateendDate可以(但不得)在前端设置。可以简单地添加附加条件:

var query = from x in db.DoubleDataValueArchive select x;
query = query.Where(x => x.DataPointId != null);

// Check if only errors should be shown (that are listed in errorDps)
List<int> errorDps = new List<int>();
if (errorsOnly.HasValue) {
    if (errorsOnly == true)
    {
        errorDps = db.DataPoints.Where(x => x.DataType == 4).Select(x => x.Id).ToList();
        query = query.Where(x => errorDps.Contains((int)x.DataPointId));
    }
}

// Start Date
if (startDate.HasValue) {
    startDate = startDate.Value.ToUniversalTime();
    query = query.Where(x => x.DateValue >= startDate);
}

// End Date
if (endDate.HasValue)
{
    endDate = endDate.Value.ToUniversalTime();
    query = query.Where(x => x.DateValue <= endDate);
}

......等等。这是完全动态的,但同时可以安全使用。当您从IQueryable创建列表或类似内容时,组装的SQL查询最终只会被执行一次。

答案 3 :(得分:0)

我认为您正在寻找的是动态LINQ。这是LINQ团队自己提供的库。

您需要做的是使用字符串表达式,如本博客所示 - http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library