【问题标题】:Retrieving the username from MembershipUser for a join query从 MembershipUser 中检索用户名以进行连接查询
【发布时间】:2013-07-06 21:26:24
【问题描述】:

我是使用 C#、linq 的新手。我正在尝试将用户名添加到查询中以将其显示为 ListView 的数据源的一部分,我已经测试了几种加入方式,但总是收到下一个错误:

“无法创建类型为‘Web.Admin.system.User’的常量值。此上下文仅支持原始类型或枚举类型。”

我的代码是:

//Entities

public class Category
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

public class Order
{
    public Guid Id { get; set; }
    public string Description { get; set; }
    public Guid CategoryId { get; set; }
    public Guid UserId { get; set; }
 }

//class added just for getting the user list  (possibly, I do not need)
public class User
{
    public Guid Id { get; set; }
    public String Name { get; set; }
}

这是我准备过滤器的代码

  //retrieve the data from Order and Category
  IQueryable<Order> orders = orderService.GetAllOrders();
  IQueryable<Category> category = categoryService.GetAllCategories();
  //obtain the users
  MembershipUserCollection members = Membership.GetAllUsers();

  // 1st option for managing users directly with memberShip variable
  var memberShip = members.Cast<MembershipUser>().ToDictionary(m => m.ProviderUserKey, m => m.UserName).AsQueryable();

  // 2nd option, I have added this code to see if I could manage the users as a list
  List<User> users = new List<User>();
  foreach (var _member in memberShip)
        {
            users.Add(new User { Id = (Guid)_member.Key, Name = _member.Value });
        }

  //Getting information to fill a listview
        var DDLsource = from i in orders
                        join c in category on i.CategoryId equals c.Id
                        join u in users on i.UserId equals u.Id // 1st I tried to use memberShip directly but gave me error of types
                        select new
                        {
                            i.Id,
                            i.Description,
                            CategoryName = c.Name,
                            UserName = u.Name
                        };
        ListViewOrders.DataSource = DDLsource.ToList();

这里是触发错误的地方,我试图理解错误并做其他解决方案,我测试了如下查询:

示例 2

        var DDLsource = from i in orders
                        join c in category on i.CategoryId equals c.Id
                        select new
                        {
                            i.Id,
                            i.Description,
                            CategoryName = c.Name,
                            UserName = (from u in users where u.Id == i.UserId select u.Name)
                        };

示例 3

        var DDLsource = from i in orders
                        join c in category on i.CategoryId equals c.Id
                        join u in Membership.GetAllUsers().Cast<MembershipUser>() on i.UserId equals ((Guid)u.ProviderUserKey)
                        select new
                        {
                            i.Id,
                            i.Description,
                            CategoryName = c.Name,
                            UserName = u.UserName
                        };

所有结果都相同,有人可以帮我解决我的错误肯定会非常明显。提前致谢

【问题讨论】:

  • EF 正在尝试在 SQL 查询中转换您的表达式(订单加入类别),但在尝试本地用户集合时失败
  • 感谢您的回答。但是有没有一种方法可以将本地集合转换为我尝试执行的查询的一部分?。
  • 我不这么认为。就个人而言,我会从您的 linq 表达式中删除与用户的连接,并迭代 DDLsource(手动或在新的 l2o 查询中)以操作其余数据(用户名)。
  • 这可能是个坏消息...我的意图是在一个简单的 ListView 中显示订单的一些信息以及添加它们的人的姓名。这就是为什么我试图把所有的信息放在一起。当您说剪切时,您的意思是分开我的查询,为页面中的每一行(在用户列中)插入一个 DDL 并选择用户?,作为页面级选择。

标签: c# asp.net linq


【解决方案1】:

我会做这样的事情(对不起,未经测试的代码......):

var DDLsource = 
  from i in orders
  join c in category on i.CategoryId equals c.Id
  select new
  {
    i.Id,
    i.Description,
    CategoryName = c.Name,
    i.UserId,
    UserName = ""
  };

foreach(var ddl1 in DDLsource)
  ddl1.UserName = Membership.GetUser(ddl1.UserId).Name;

【讨论】:

  • 我明白了你的想法,听起来很合理,但是当我尝试运行应用程序时,我收到消息:“无法将属性或索引器“AnonymousType#2.UserName”分配给 - 它是只读的
  • 我已经找到了几个文档,当您想要更新记录时,您不能将匿名类型与 linq to sql 一起使用。 social.msdn.microsoft.com/Forums/en-US/…forums.asp.net/t/1323970.aspx/1stackoverflow.com/questions/9755413/… >>>
  • 对不起,告诉你它未经测试。应该为中间结果创建一个类。或者在内存中实现第一组,然后 linq-join 到第二组。肯定很少有选择。稍后我会更正代码,现在我得抓紧了……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 2015-05-20
  • 2021-10-22
相关资源
最近更新 更多