我是 C#、Linq 和 .Netcore 的新手,我想做的是将 sql 中的以下查询转换为 linq
SELECT
p.policyId,
p.insuranceId,
p.policyType,
p.coverageType,
p.price,
us.FirebaseUID
FROM Policies p
JOIN Users us ON p.userId = us.FirebaseUID
我的策略是一个嵌套类,它位于父类 ExampleRes 中,我遵循了这个 question回答以填充政策列表,但我收到此错误:
Error CS1061: 'ExampleRes.PoliciesInfo' does not contain a definition for 'ToList' and no extension method 'ToList' accepting a first argument of type 'ExampleRes.PoliciesInfo' could be found (are you missing a using directive or an assembly reference?)
这是我正在使用的查询
public List<ExampleRes> GetUserInfo(string fuid)
{
var policies = (from pol in _context.Policy
join us in _context.User
on pol.userId equals us.FirebaseUID
select new ExampleRes
{
userId = us.userId,
fuid = us.FirebaseUID,
policy = (new ExampleRes.PoliciesInfo
{
policyId = pol.policyId,
policyType = pol.policyType,
policyPrice = pol.price,
coverageType = pol.coverageType
}).toList()
}).toList();
return policies;
}
这是 ExampleRes 类
public class ExampleRes
{
public ExampleRes()
{
}
// User info
public int userId { get; set;}
public string fuid { get; set; }
public List<PoliciesInfo> policy { get; set; }
// Policies info
public class PoliciesInfo{
public int policyId { get; set; }
public int policyType { get; set; }
public int coverageType { get; set; }
public int policyPrice { get; set; }
}
}
最佳答案
你的查询应该是这样的:
var policies = (from pol in _context.Policy
join us in _context.User
on pol.userId equals us.FirebaseUID
select new ExampleRes
{
userId = us.userId,
fuid = us.FirebaseUID,
policy = new List<ExampleRes.PoliciesInfo> {
new ExampleRes.PoliciesInfo
{
policyId = pol.policyId,
policyType = pol.policyType,
policyPrice = pol.price,
coverageType = pol.coverageType
}
}
}).ToList();
更新:
题目理解错了,应该是这样的。但我相信应该有更好的解决方案。
var policies = (from us in _context.User
select new ExampleRes
{
userId = us.userId,
fuid = us.FirebaseUID,
policy = (
from pol in _context.Policy
where pol.userId == us.FirebaseUID
select new ExampleRes.PoliciesInfo
{
policyId = pol.policyId,
policyType = pol.policyType,
policyPrice = pol.price,
coverageType = pol.coverageType
}
).ToList()
}).Where(u => u.policy.Count > 0).ToList();
再次更新
将 linq 函数查询与非函数查询结合起来是一种不好的做法,感谢@Ilan Keshet。这是我修改后的解决方案:
var policies = (from pol in _context.Policy
group pol by pol.userId into uid
where uid.Count() > 0
join us in _context.User
on uid.Key equals us.FirebaseUID
select new ExampleRes
{
userId = us.userId,
fuid = us.FirebaseUID,
policy = (from pol in _context.Policy
where pol.userId == uid.Key
select new ExampleRes.PoliciesInfo
{
policyId = pol.policyId,
policyType = pol.policyType,
policyPrice = pol.price,
coverageType = pol.coverageType
}).ToList()
}).ToList();
关于c# - Linq 查询填充接收错误的嵌套类中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50959206/