【问题标题】:Linq expression where clause with generic type具有泛型类型的 Linq 表达式 where 子句
【发布时间】:2016-04-27 13:30:49
【问题描述】:

在我的数据访问层中,我使用以下 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; }

但是出现错误

“无法解析符号 Content_type”

我该如何解决这个问题?

【问题讨论】:

  • 附注:你真的应该以相反的顺序链接调用 - Where 然后 Distinct 然后 ToList
  • thansk @IvanStoev,我是 LINQ 查询/Lambda 表达式的新手,还在学习。只是好奇这将如何改变结果。我从我的数据库中验证了结果,结果是一样的。
  • 它不会改变结果,而是改变处理的地方。您编写它的方式将读取内存中的所有表记录,然后进行过滤等,而在第二种情况下,所有过滤都将在数据库内完成。

标签: linq generics types lambda where


【解决方案1】:

问题在于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");

希望对你有帮助。

【讨论】:

  • Floc,很好的答案,感谢您显示通过 where 条件!
【解决方案2】:

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

如果您总是通过包含 Content_type 定义的 T 类,请尝试以下操作。

Context.Set&lt;T&gt;().ToList().Distinct().Where(x =&gt; (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

然后您可以在要为其调用Get&lt;T&gt; 方法的类中实现IHasContentTypeField

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

【讨论】:

  • 问题是,在我的例子中,类型 T 可能有两种可能性,幸运的是这两种类型都有 Content Type 字段。
  • @pikachu 很好,实现IHasContentTypeField 接口int 他们两个。你可以走了。
  • 我对这个接口有点困惑,在我的例子中,可以有多个类,其中一个属性为 Content_type。能否详细解释一下。
  • 我正在使用实体框架,并且类(具有 Content_type 字段)是我的域模型之一。这会是创建界面的正确方法吗?
  • @pikachu 您应该使用接口来正确管理调用Get 方法(您正在处理Generics)。你使用哪个 ORM 并不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多