【发布时间】:2017-01-12 10:26:58
【问题描述】:
Linq to SQL Concat / Union 不适用于自定义类。
自定义类
public class CustomClass
{
public string FirstName { get; set; }
public string LastName { get; set; }
public List<Accesses> Accesses { get; set; }
}
联合:
IQueryable<CustomClass> objQuery = context.Users
.Where(W => W.Auth == true)
.Select(S => new CustomClass()
{
FirstName = S.FirstName,
LastName = S.LastName,
Accesses = context.AuthFalse
.Where(W => W.UID = S.ID)
.Select(S1 => new Accesses()
{
AccessesID = S1.AccessesID,
})
.ToList(),
})
.Union(context.Users
.Where(W => W.Auth == true)
.Select(S => new CustomClass()
{
FirstName = S.FirstName,
LastName = S.LastName,
Accesses = context.AuthTrue
.Where(W => W.UID = S.ID)
.Select(S1 => new Accesses()
{
AccessesID = S1.AccessesID,
})
.ToList(),
})
);
当我执行上述查询时,出现以下错误:
“Distinct”操作无法应用于集合 指定参数的 ResultType。\r\n参数名称:参数
连接
IQueryable<CustomClass> objQuery = context.Users
.Where(W => W.Auth == true)
.Select(S => new CustomClass()
{
FirstName = S.FirstName,
LastName = S.LastName,
Accesses = context.AuthFalse
.Where(W => W.UID = S.ID)
.Select(S1 => new Accesses()
{
AccessesID = S1.AccessesID,
})
.ToList(),
})
.Concat(context.Users
.Where(W => W.Auth == true)
.Select(S => new CustomClass()
{
FirstName = S.FirstName,
LastName = S.LastName,
Accesses = context.AuthTrue
.Where(W => W.UID = S.ID)
.Select(S1 => new Accesses()
{
AccessesID = S1.AccessesID,
})
.ToList(),
})
);
当我执行上述查询时,出现以下错误:
{"不支持嵌套查询。Operation1='UnionAll' Operation2='MultiStreamNest'"}
最后,我想要做的是,如果用户表的 Auth 字段为 true,那么我想要来自 AuthTrue 的数据> 表并希望存储在 List 字段中,如果 Users 表的 Auth 字段为 false 比我想要的数据来自 AuthFalse 表并希望存储在 List 字段中。
我希望所有这些都在单个查询或最多 2 到 3 个查询中完成。
谢谢。
【问题讨论】:
-
可能你应该重写你的 Concat 尝试如下:从用户开始,然后对 AuthFalse 和 AuthTrue 进行 2 次左连接,通过 user.Auth 字段和正确的右匹配添加过滤,使用用户选择匿名类。 Id、user.LastName、user.FirstName + AuthFalse 匹配或 AuthTrue 匹配。在这个阶段,必须通过强制转换 ToEnumerable 来查询,然后剩下的就是正确的分组 + 选择。
-
@VitaliyKalinin,谢谢,您能提供一些代码 sn-p 吗?因为我不明白你想说什么来实现。
标签: c# .net linq linq-to-sql linq-to-entities