我有一个 FlightTicketRequestDocument 列表,用于患者及其陪同人员申请飞机票。这些文件与名为 GroupId 的dataframe = pd.read_sql('Select * FROM classic.dbo.sample3',con=conn)
dataframe.to_csv('data.csv', index = None)
分组。
我正在尝试将它们分组到该对象中
GUID
PrincipalDocument (如果有的话)保存患者。(如果没有,我们只想要第一个陪同)
GroupDocuments 拥有陪同人员。(第一个放置在 PrincipalDocument 中的人除外)
我正在尝试使用不同的表达式在public class FlightTicketRequestDocumentGroup
{
public Guid GroupId { get; set; }
public FlightTicketRequestDocument PrincipalDocument { get; set; }
public List<FlightTicketRequestDocument> GroupDocuments { get; set; }
}
语句中设置我的值,这取决于是否有耐心,但是我遇到了错误:
不支持嵌套查询。 Operation1 ='Case'Operation2 ='VarRef'
这是代码(注意:当此人是患者时, StayEscortId 为空。):
Select New
我可以使用什么代替条件运算符var indexGroups = await _db.FlightTicketRequests
.OrderBy(f => f.FirstName)
.ProjectTo<FlightTicketRequestDocument>()
.GroupBy(f => f.GroupId)
.Select(g => new FlightTicketRequestDocumentGroup
{
GroupId = g.Key,
PrincipalDocument = g.Any(f => f.StayEscortId == null)
? g.FirstOrDefault(f => f.StayEscortId == null)
: g.FirstOrDefault(),
GroupDocuments = g.Any(f => f.StayEscortId == null)
? g.Where(c => c.StayEscortId != null).ToList()
: g.Where(c => c.StayEscortId != null).OrderBy(f => f.FullName).Skip(1).ToList()
})
.ToListAsync(cancellationToken);
?
答案 0 :(得分:0)
需要检查一次或两次(或一次或两次调整),但是如果我记得正确的话,表达式树接受空合并运算符,您可以尝试在三元位置进行交换。 从您的示例开始(和BASING),也许像下面这样?
var indexGroups = await _db.FlightTicketRequests
.OrderBy(f => f.FirstName)
.ProjectTo<FlightTicketRequestDocument>()
.GroupBy(f => f.GroupId)
.Select(g => new FlightTicketRequestDocumentGroup
{
GroupId = g.Key,
PrincipalDocument = g.FirstOrDefault(f => f.StayEscortId == null) ?? g.OrderBy(f => f.FullName).FirstOrDefault(),
GroupDocuments = g.Where(c => c.StayEscortId != null).OrderBy(f => f.FullName).Skip(Math.Max(x.Count(y => y.StayEscortId == null), 1)).ToList()
})
.ToListAsync(cancellationToken);
答案 1 :(得分:0)
我最终使用的解决方案:
如@mjwills所指定,由于我只希望 StayEscordId 首先是null
的值,所以我要做的就是将其排序为boolean
({{ 1}}的值最终排在顶部)。
对于该小组的其他成员,我在跳过1(我选择的第一个)的同时执行相同的操作。
修改后的代码:
false
答案 2 :(得分:-1)
如果要使用if / else而不是三元条件,则查询的外观如下。您只需要在.Select()
内使用一个代码块即可返回结果:
var flightTicketRequestDocuments = await _db.FlightTicketRequests
.OrderBy(f => f.FirstName)
.ProjectTo<FlightTicketRequestDocument>()
.GroupBy(f => f.GroupId)
.ToListAsync(cancellationToken);
var indexGroups = flightTicketRequestDocuments
.Select(g =>
{
FlightTicketRequestDocument principalDocument;
List<FlightTicketRequestDocument> groupDocuments;
if (g.Any(f => f.StayEscortId == null))
{
principalDocument = g.FirstOrDefault(f => f.StayEscortId == null);
groupDocuments = g.Where(c => c.StayEscortId != null).ToList();
}
else
{
principalDocument = g.FirstOrDefault();
groupDocuments = g.Where(c => c.StayEscortId != null).OrderBy(f => f.FullName).Skip(1).ToList();
}
return new FlightTicketRequestDocumentGroup
{
GroupId = g.Key,
PrincipalDocument = principalDocument,
GroupDocuments = groupDocuments
};
})
.ToList();
请注意,此方法需要在执行IQueryable
之前枚举.Select()
,以便将其应用于IEnumerable
。