首页 > 解决方案 > 如何以列表形式将 Linq 添加到 EF 数据到 Class Object C#?

问题描述

我的班级用户是,

public class User
{
    public string Username
    {
        get;
        set;
    }
    public string Password
    {
        get;
        set;
    }
    public string [] RoleName
    {
        get;
        set;
    }
}

Linq 到 EF,

var innerJoinQuery =
                                (from u
                                in db.Users
                                join ur in db.UserRoles
                                    on u.UserID equals ur.UserID
                                join r in db.Roles on ur.RoleID equals r.RoleID
                                select new {
                                    Username=u.Username,
                                    Password=u.Password,
                                    RoleName = r.RoleName, }).ToList();

结果是,

Username = "Abc" Password="123"  RoleName = "Admin"
Username = "Test" Password="1234"  RoleName = "User"
Username = "Abc" Password="123"  RoleName = "Super User"

Manualy 我在用户类对象中添加数据,

List<Models.User> UserList = new List<Models.User>();
UserList.Add(new Models.User { Username ="Abc",Password="123",RoleName = new string[] {"Admin","Supe User"} });
UserList.Add(new Models.User { Username = "Test", Password = "1234", RoleName = new string[] { "User" } });

如何添加 linq 以查询列表对象中的数据如果您不理解我的问题,请告诉我

谢谢

编辑:

这不是这些值的硬编码,它可以比这更多取决于查询结果

标签: c#listlinqobjectlinq-to-entities

解决方案


您是否尝试过实例化匿名类型而不是Models.User?

var resultList = (
       ...
       select new {
            Username=u.Username,
            Password=u.Password,
            RoleName = new [r.RoleName] }
   )
   .ToList();

resultList.Add(new {
            Username=u.Username,
            Password=u.Password,
            RoleName = r.RoleName })

在这两种情况下,字段的数量和名称应该相同。

UPD

如果您想反之亦然,请将您的innerJoinQueryselect 语句更改为 selection Models.User,而不是匿名类型:

var innerJoinQuery = (
       ...
       select new Models.User {
            Username=u.Username,
            Password=u.Password,
            RoleName = new [] {r.RoleName} // assuming you have string in database
       }
   )
   .ToList();

UserList.AddRange(innerJoinQuery);

如果您想加入查询中的本地集合,那么AFAIK 是不可能的,因为EF 将无法将其转换为SQL。

更新 2

错过了您Models.UserThe array type 'System.String[]' cannot be initialized in a query result您的 EF 版本中的数组。所以引入一个新的SelectafterToList是你的出路:

var innerJoinQuery = (
       ...
       select new  {
            Username=u.Username,
            Password=u.Password,
            RoleName = r.RoleName
       }
   )
   .ToList()
   .Select(u => new Models.User {
            Username=u.Username,
            Password=u.Password,
            RoleName = new [] {r.RoleName}
       });

UserList.AddRange(innerJoinQuery);

推荐阅读