【问题标题】:How to convert this query from sql to linq-to-entities如何将此查询从 sql 转换为 linq-to-entities
【发布时间】:2015-12-15 10:04:57
【问题描述】:

如何将以下查询从 sql(Oracle) 转换为 linq-to-entities:

select * FROM ActivityPromptText where ActivityId = 8 
         and ProcessTypeId = 1 and ProcessId is null

当我编写这个 c# 时,它返回 null,而相同的查询在 sql 中返回结果。 Linq 查询是:

var text2 = this.context.ActivityPromptText
       .Where(pt => (pt.ActivityId == activityId && pt.ProcessTypeId == processType) 
                      && pt.ProcessId == null)
      .Include(pt => pt.Prompt).FirstOrDefault();

=========================

模型是:

[Table("ActivityPromptText")]
public class ActivityPromptText
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [Column(Order = 1)]
    public int PromptTextId { get; set; }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [Column(Order = 2)]
    public int ActivityId { get; set; }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [Column(Order = 3)]
    public int ProcessTypeId { get; set; }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [Column(Order = 4)]
    public int? ProcessId { get; set; }

    [ForeignKey("PromptTextId")]
    public virtual PromptText MbopPrompt { get; set; }
}

和:

[Table("PromptText")]
public class PromptText
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int PromptTextId { get; set; }

    public string PromptText { get; set; }

}

并且 DBContext 文件有:

公共虚拟 DbSet ActivityPromptTexts { get;放; }

公共虚拟 DbSet PromptTexts { get;放; }

【问题讨论】:

  • 你有没有尝试过?
  • 试过这个:var text2 = this.context.ActivityPromptText .Where(pt => pt.ActivityId == activityId && pt.ProcessTypeId == processType && pt.ProcessId == null) .Include(pt => pt.Prompt).FirstOrDefault();
  • 好的,为什么在 Where 子句中有括号?在ProcessTypeId ProcessId 之间?它改变了查询吗?像这样改变它并尝试:- .Where(pt => pt.ActivityId == activityId && pt.ProcessTypeId == processType && pt.ProcessId == null)
  • @RahulSingh 括号没有任何作用。我认为问题出在他的模型中,因为查询看起来是正确的。你能展示一下PromptActivityPromptText 的模型吗?
  • 公共虚拟 DbSet ActivityPromptTexts { get;放; } 和公共虚拟 DbSet PromptTexts { get;放; }

标签: linq ef-code-first linq-to-entities entity-framework-6 oracle-sqldeveloper


【解决方案1】:

我认为问题在于您的 ProcessId 属性的 Key 属性。我认为键不能为空,它们真的是键还是索引?如果它们是索引并且您使用的是 EF6.1+:http://msdn.microsoft.com/en-us/data/jj591583.aspx#Index

还支持多列索引。

【讨论】:

  • 不客气,只是出于好奇,Entity 框架是否生成了此代码?我曾经也有过 EF 使用 key 属性而不是 index
  • 不,我们首先使用 EF 代码。我们为数据库中的表创建实体。
猜你喜欢
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2017-10-06
  • 2020-08-28
  • 1970-01-01
相关资源
最近更新 更多