2013-04-29 83 views
0

我创建了一个小的测试类,它从xml文件返回数据。Linq使用谓词不起作用

我现在想使它更加动态使用LINQ,但无法让它工作。

public class LenderCollection 
{ 
    string fileName = "C:\\Lenders.xml"; 

    public IEnumerable<Lender> Lenders { get; set; } 

    public void FetchLenders(Expression<Func<Lender, bool>> predicate = null) 
    { 
     IEnumerable<Lender> lenders = XmlHelper.GetObjectFromXml<List<Lender>>(fileName, "AllLenders"); 

     Lenders = predicate.IsNotNull() ? lenders.Where(predicate) : lenders; 

    } 
} 

Visual Studio是给了一个错误上的“lenders.Where(谓语)” - 该消息是“......不包含在哪里定义...”

任何想法我做错了?

* UPDATE *

这似乎是与谓词 - 。哪里是avaialable否则。

+0

在您的文件顶部添加'使用System.Linq;'和'使用System.Linq.Expressions;' – Andomar 2013-04-29 09:37:06

+0

@Andomar - 已经包含 – dotnetnoob 2013-04-29 09:43:04

+0

顺便说一句,您应该始终发布整个异常消息。虽然有时候很长很难阅读,但它可能已经包含了解决问题的方法。 – sloth 2013-04-29 09:48:58

回答

5

有没有扩展方法Where延伸IEnumerable<T>并采取Expression<Func<T, bool>>类型的参数。

你有两个选择:

  1. 使用一个IQueryable<Lender>,而不是IEnumerable<Lender>(您可以在此方便地通过打电话只是.AsQueryable()),如果你婉保持参数predicateExpression<Func<Lender, bool>>

  2. 使用类型Func<Lender, bool>而不是Expression<Func<Lender, bool>>代表predicate参数。由于您正在从文件加载数据,因此在IEnumerable上使用IQueryable毫无意义。

+0

感谢dominic - 这两个工作,但我用你提到的原因2。 – dotnetnoob 2013-04-29 09:58:24

0

这是抱怨,无论类型lenders是没有.Where方法。这可能是因为:

  • 您还没有using System.Linq;
  • 类型的lenders不是IEnumerable或相似。
+0

Aleady包含linq命名空间 - 请参阅上文 - 变量贷方是IEnumerable dotnetnoob 2013-04-29 09:45:08

-1

替换:

lenders.Where(predicate) 

有了:

lenders.ToList().Where(predicate) 

两个应该能够返回IEnumerable

与此相关的主要问题是查询将在.ToList()命令上执行。我想这是根据你期望的功能来做的,如果这可以满足你的需求。