【问题标题】:How to add in Linq to EF data in list form to Class Object C#?如何以列表形式将 Linq 添加到 EF 数据到 Class Object C#?
【发布时间】:2020-08-25 08:45:28
【问题描述】:

我的班级用户是,

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"

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

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 以查询 List 对象中的数据 如果您不明白我的问题,请告诉我

谢谢

已编辑:

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

【问题讨论】:

  • 如果此列表在当前方法之外使用,则创建一个新类型以包含任务相关信息和列表:例如“IList”。然后选择,例如。 “选择(u => new UserSummary { Name = u.Username })”。当前代码的问题是 anonymous types 不能在可以推断类型的上下文之外有用地使用。
  • 虽然可以使用 EF 类型本身,但我建议在适用时使用与任务相关的类型将 EF/可查询与下游使用区分开来。
  • 不是使用外部方法,能不能详细举例
  • 如果它仅在方法内部使用,那么var keyword 在许多情况下可用于允许类型推断: var d = users.Select(u => new { Name = u.Username }) ;字符串 x = d.FirstOrDefault(u => u.Name == “你好!”);请注意,匿名类型 (new {..}) 从未在代码中指定名称。因为它没有名字,所以 List 是不可能的;和 var 无关紧要。
  • @john 您使用 EF 核心还是 EF 用于 .NetFramework?

标签: c# list linq object linq-to-entities


【解决方案1】:

您是否尝试过实例化匿名类型而不是 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

如果您想反之亦然,请将您的 innerJoinQuery 选择语句更改为选择 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。

UPD 2

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

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);

【讨论】:

  • 在您的回答中,您在结果列表中添加查询结果我不明白我想在列表中添加内部联接查询结果
  • I am getting error on RoleName = r.RoleName line can't convert string to string[] 你能检查我的用户模型类吗
  • @john 我已经修复了 =)) 将其更改为 RoleName = new [] {r.RoleName}
  • 现在我收到此错误(无法在查询结果中初始化数组类型'System.String[]'。考虑使用'System.Collections.Generic.List`1[System.String] ' 代替。) :(
猜你喜欢
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多