1

我是使用 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
                        };

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

4

1 回答 1

0

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

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;
于 2013-07-10T06:54:44.243 回答