Linq表达式where子句具有泛型类型

时间:2016-01-21 10:41:49

标签: linq generics types lambda where

在我的数据访问层中,我使用以下Lambda表达式调用GET方法:

public List<T> Get<T>() where T : class { var list = Context.Set<T>().ToList().Distinct().Where(x => x.Content_type == "Test"); return list; }

但是收到错误

  

&#34;无法解析符号Content_type&#34;

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

问题是Content_type不是T类的一部分,因为它只是一个类。

正如@tchelidze所说,您可以在函数上设置where子句来指定类型,如下所示:

public List<T> Get<T>() where T : IYourCommonInterface
{
    var list = Context.Set<T>().Where(x => x.Content_type == "Test").Distinct().ToList();
    return list;
}

但是如果你需要完全通用,你可以像这样为你的函数添加一个选择器:

public List<T> Get<T>(Func<T, object> selector) where T : class
{
    var list = Context.Set<T>().Where(x => selector(x) == "Test").Distinct().ToList();
    return list;
}

并使用它:

Get(x => x.Content_type);

此外,如果你想更进一步,你可以通过整个条件:

public List<T> Get<T>(Func<T, bool> condition) where T : class
{
    var list = Context.Set<T>().Where(condition).Distinct().ToList();
    return list;
}

并像这样使用它:

Get(x => x.Content_type == "test");

希望它有所帮助。

答案 1 :(得分:0)

原因是您对T的所有了解都是class。您不知道它是否包含Content_type属性。

如果您始终传递包含T定义的Content_type类,请尝试以下操作。

  Context.Set<T>().ToList().Distinct().Where(x => (x as SomeClassWithContentTypeField).Content_type == "Test");

更好的方法是引入声明IHasContentTypeField属性

的接口Content_type
public interface IHasContentTypeField
{
  string Content_type { get; set; }
}

然后将T约束到此接口。

public List<T> Get<T>() where T : IHasContentTypeField

然后,您可以在要为其调用IHasContentTypeField方法的类中实现Get<T>

public class A : IHasContentTypeField
{
  public string Content_type { get; set; }
}