c# - Linq 查询填充接收错误的嵌套类中的列表

标签 c# linq

我是 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/

相关文章:

c# - 在事件中只打开一个表格

c# - 多个引用类型字段上的 LINQ GroupBy;自定义相等比较器

LINQ - 使用类型计数对对象进行分组

c# - MySql Linq-实体日期比较

c# - 字节流单元测试

c# - Resharper 警告将枚举转换为 UIntPtr,但没有编译器警告

C# Invalidate 不调用 paint 方法

c# - 如何提高 DataSet 到 List<T> 的性能?

c# - BindingSource 似乎不包含在部分类中创建的属性

linq - 体面的免费 Linq 调试器