【发布时间】:2017-08-04 05:47:42
【问题描述】:
我正在尝试转换此 SQL 查询:
select t.id,t.name as table_name,r.name as room_name,iif(c.id is null ,0,1) as opened,
from gs_pos_t t
inner join gs_pos_r r on t.id_r=r.id
left join gs_pos_c c on t.id=c.id_t
left join gs_pos_pz p on c.id=p.id_c
where c.open_date is not null
group by 1,2,3,4
我需要从所有房间中选择所有表以及它们是否有已开售的状态,在这种情况下是当前已开售的总和
我尝试过这样的事情,但没有运气:
db.GS_POS_t.Join(
db.GS_POS_r,
t => t.ID_r,
r => r.ID,
(tables, rooms) => new {tables,rooms})
.GroupJoin(
db.GS_POS_C
.GroupJoin(
db.GS_POS_C_PZ,
c => c.ID,
p => p.ID_C,
(sales, p) => new { sales, s_detail= p.DefaultIfEmpty() }
)
,
mg => mg.tables.ID,
cg => cg.sales.ID_t,
(tablesrooms, saleswithdetail) => new { tablesrooms, saleswithdetail }
).Where(r => r.saleswithdetail.) <=Here !!!!
);
这是模型:
GS_POS_T (tables)
public long ID { get; set; }
public short ID_R { get; set; }
public string NAME { get; set; }
public virtual ICollection<GS_POS_C> GS_POS_C { get; set; }
public virtual GS_POS_R GS_POS_R { get; set; }
...
GS_POS_R (rooms)
public short ID { get; set; }
public string NAME { get; set; }
public virtual ICollection<GS_POS_T> GS_POS_T { get; set; }
...
GS_POS_C (sales)
public long ID { get; set; }
public long ID_T { get; set; }
public Nullable<System.DateTime> OPEN_DATE { get; set; }
......
public virtual GS_POS_M GS_POS_M { get; set; }
public virtual ICollection<GS_POS_C_PZ> GS_POS_C_PZ { get; set; }
GS_POS_C_PZ (sale details)
public long ID { get; set; }
public long ID_C { get; set; }
public Nullable<decimal> CANT { get; set; }
public Nullable<decimal> PRICE { get; set; }
public virtual GS_POS_C GS_POS_C { get; set; }
...
部分解决方案 我得到了下一个几乎可以工作的代码,但有两个问题:
1.我无法在 db.GS_POS_C 的最终结果 ID 字段中包含
ExceptionMessage":"转换为值类型 'System.Int64' 失败,因为具体化的值为 null。结果类型的泛型 参数或查询必须使用可为空的类型。"
2.我想把它转换成方法语法
from t in db.GS_POS_T
join r in db.GS_POS_R on t.id_r equals r.id //it is inner join statement
join c in db.GS_POS_C on t.id equals c.id_t into ct
from sub1 in ct.DefaultIfEmpty() //it is left join statement
join p in db.GS_POS_PZ on sub1.id equals p.id_c into psub1
from sub2 in psub1.DefaultIfEmpty() //it is left join statement
where t.activ == 1
select new { t.id, t.name, rname = r.name, sub2.cant, sub2.price } into x
group x by new { id = x.id, name = x.name, rname = x.rname } into g
select new
{
tid = g.Key.id,
tname = g.Key.name,
rname = g.Key.rname,
sumpcantpprice = g.Sum(abc => abc.price * abc.cant)
};
感谢您的帮助!
【问题讨论】:
-
你的模型看起来怎么样?
-
嗨,我在第一篇文章中添加了
-
你应该使用导航属性(如
GS_POS_T),而不是加入。
标签: c# asp.net entity-framework linq