在实体框架中将LINQ动态查询转换为IQueryable

本文关键字:查询 转换 IQueryable 动态 LINQ 实体 框架 | 更新日期: 2023-09-27 18:11:29

我试图转换一个LINQ查询,将两个表连接到实体框架中的IQueryable类型,这样我就可以进一步在其上应用过滤器表达式。

代码如下:

IQueryable<Bill_Joined_V1> bills = 
     (from primary in _billEntity.BillTable
      join secondary in _billEntity.BillInfoTable on primary.BillID equals secondary.BillID
      orderby primary.BillID
      select new
                {
                    primary.BillID,
                    primary.CustomerID,
                    secondary.Name,
                    secondary.Value
                }).AsQueryable<Bill_Joined_V1>().Where(FilterExp);

实体类如下:

public class Bill_V1
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid BillID { get; set; }
    public string BillTypeID { get; set; }
    public Guid CustomerID { get; set; }
    public Guid UserID { get; set; }
    [ForeignKey("UserID")]
    public virtual User_V1 UserTable { get; set; }
    public double AmountDue { get; set; }
}
public class BillInfo_V1
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long BillInfoID { get; set; }
    public Guid BillID { get; set; }
    [ForeignKey("BillID")]
    public virtual Bill_V1 BillTable { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}
// Dummy bill record for query purpose
public class Bill_Joined_V1
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long BillRecID { get; set; }
    public Guid BillID { get; set; }
    [ForeignKey("BillID")]
    public virtual Bill_V1 BillTable { get; set; }
    public Guid CustomerID { get; set; }
    [ForeignKey("CustomerID")]
    public virtual Customer_V1 CustomerTable { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}

代码无法编译。它产生错误信息

"来。IQueryable'不包含'AsQueryable'的定义,并且最佳扩展方法重载'System.Linq.Queryable.AsQueryable(System.Collections.Generic.IEnumerable)'有一些无效参数

是否有一种方法可以将LINQ查询转换为IQueryable类型而不将查询结果放入物理表?我该如何解决这个问题?谢谢。

在实体框架中将LINQ动态查询转换为IQueryable

你不需要调用.AsQueryable().Where()被设计为返回适当类型的IQueryable。但是代码中IQueryable的确切类型不会是IQueryable<Bill_Joined_V1>,因为您使用的是匿名类型。真正需要做的是而不是在这里使用匿名类型:

select new
                                {
                                    primary.BillID,
                                    primary.CustomerID,
                                    secondary.Name,
                                    secondary.Value
                                }).

改为

select new Bill_Joined_V1 { /* initialize properties */ }