在实体框架中将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
类型而不将查询结果放入物理表?我该如何解决这个问题?谢谢。
你不需要调用.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 */ }