当前位置:  开发笔记 > 编程语言 > 正文

LINQ中的动态查询

如何解决《LINQ中的动态查询》经验,为你挑选了1个好方法。

如果我说Customer字段包含字段,我如何为Linq编写动态查询:

string name
string address
int phoneno

我必须根据类似的信息进行查询

query = string.Empty;

if(!string.IsNullorEmpty(name))
{
   query += "@name = name";
}

if(!string.IsNullorEmpty(address))
{
   query += "@address = address";
}

if(!string.IsNullorEmpty(phoneno))
{
   query += "@phoneno = phoneno";
}

var result = from condition in customer
    where(query)
    select condition;

编辑#1:

这些项目在运行时可以更改

private Customer[] GetCustomers(Dictionary attributes)
{
   here the attribute may be, name alone, or name and address, or name address and phoneno


      foreach(string field in attributes.key)
      {
           query += field == attributes[key];

      }

         Customers[] =ExecuteQuery(query);

}

LINQ是否支持这种查询?

编辑#2:

嗨Mouk,
因为我是C#的新手,我仍在努力,这对我不起作用.

var query = _ConfigFile.ConnectionMasterSection;

for(int i = 0; i < filter.count; i++)
{
    query = result.Where(p => typeof(ConnectionMaster).GetProperty(filter[i].Attribute).Name == filter[i].Value);
}

这是空的,我用这个

var query = _ConfigFile.ConnectionMasterSection;

//Hard coded
res.Where(q => q.category == filter[0].Value);

它按预期工作.

嗨Bryan Watts,
我也尝试了你的代码,我收到了这个错误:"Lambda参数不在范围内".

for(int i = 0; i < filter.count; i++)
{
    Field item = filter[i];

    MemberExpression param = Expression.MakeMemberAccess(Expression.Parameter(typeof(Connection), "p"), typeof(Connection).GetProperty(item.Attribute));

    MemberExpression constant = Expression.MakeMemberAccess(Expression.Constant(item), typeof(Field).GetProperty("Value"));
}


try
{
    var myquery = Queryable.Where(coll, Expression.Lambda>(
    Expression.Equal(param, constant), Expression.Parameter(typeof(Connection),"p")));
}

这里有什么错误?



1> Quintin Robi..:

看看这个http://www.albahari.com/nutshell/predicatebuilder.aspx,它允许强类型谓词构建,它可以非常好.如果您想要实际使用动态字符串构建谓词,那么您可以使用ScottGu提供的LINQ Dynamic Query Library.

虽然我会在第二个选项之前推荐第一个选项,但两者都能达到你想要的效果.

允许你这样做:

var predicate = PredicateBuilder.True();

if(!string.IsNullOrEmpty(name))
    predicate = predicate.And(p => p.name == name);


...

var myResults = Context.MyLinTypeQueryTable.Where(predicate);

和更多.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有