动态where子句lambda或C#中的查询

时间:2012-06-13 11:35:07

标签: c# entity-framework dynamic lambda

我正在尝试编写动态lambda或查询,但它发生错误..

表示lambda;我创建了一个函数

    public IEnumerable<musteriler>  GetCustomers<musteriler>(Expression<Func<musteriler, bool>> where)
   {
    IEnumerable<musteriler> _musteriler = market.musteriler.Where(where).Select(m => m);

     return _musteriler;

    }

我打电话就是那个

  IEnumerable<musteriler> _musteriler  = helper.GetCustomers<musteriler>(m => m.MAktif == true);

我在Where( where

中遇到两个错误
    The best overloaded method match for System.Data.Objects.ObjectQuery<AkilliMarket.musteriler>.Where(string, params System.Data.Objects.ObjectParameter[])' has some invalid arguments

   Argument 1: cannot convert from 'System.Linq.Expressions.Expression<System.Func<musteriler,bool>>' to 'string'

在我尝试了像

这样的字符串查询之后
 IEnumerable<musteriler> _musteriler=  market.musteriler.Where("MAktif = true").Select(m => m) as IEnumerable<musteriler>;

是的它有效,但我不能使用_musteriler ..例如当我写_musteriler.Count();我收到此错误

  'MAktif' could not be resolved in the current scope or context. Make sure that all referenced variables are in scope, that required schemas are loaded, and that namespaces are referenced correctly. Near simple identifier, line 6, column 1.

MAktif是db中我的集合表的列名。我尝试了另一个列但结果是一样的..

我的错误在哪里?

4 个答案:

答案 0 :(得分:1)

问题是IQueryable<T>.Where是一种扩展方法,在考虑扩展方法之前,ObjectQuery.Where被选为“最佳重载方法匹配”。

尝试:

public IEnumerable<AkilliMarket.musteriler> GetCustomers<AkilliMarket.musteriler>(Expression<Func<AkilliMarket.musteriler, bool>> predicate)
{
   return market.musteriler.AsQueryable().Where(predicate);
}

答案 1 :(得分:1)

public IEnumerable<musteriler>  GetCustomers<musteriler>(Expression<Func<musteriler, bool>> predicate)
       {
        return market.musteriler.AsQueryable().Where(predicate).AsEnumerable();

        }

如果不起作用

你可以试试吗

 var _musteriler=  market.musteriler.Where("it.MAktif = @val", new ObjectParameter("val", true)).AsEnumerable().Count();

如果它有效,你的方法应该是(如果仍有意义制作方法)

public IEnumerable<musteriler> GetCustomers(string whereClause, params ObjectParameter[] parameters) {
   return market.musteriler.Where(whereClause, parameters).AsEnumerable(); 
}

答案 2 :(得分:0)

我想你需要在代码的开头添加它:

using System.Linq;

看起来你的市场是ObjectContext而musteriler是ObjectSet并且它没有提供接受lambda的地方 - 你需要扩展IQueryable上接受lambda表达式的方法。

答案 3 :(得分:-1)

在我尝试的示例中,我收到了错误,

  

方法没有超载&#39;其中&#39;需要3个参数

使用我的where子句表达式使用SQLParametera。

我发现我需要

  

使用System.Linq.Dynamic;   一旦我发现它,DUH