C# 无法创建“匿名类型”类型的常量值。此上下文中仅支持基元类型或枚举类型two-db Linq查询

C# 无法创建“匿名类型”类型的常量值。此上下文中仅支持基元类型或枚举类型two-db Linq查询,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我有下面的控制器,我在其中构建了两个Linq查询以合并成一个以填充下拉列表。我这样做是因为数据来自两种不同的环境 方法是: private PeopleContext Peopledb = new PeopleContext(); private IARContext db = new IARContext(); public ViewResult CreateAsset() { var Posts = (from a i

我有下面的控制器,我在其中构建了两个Linq查询以合并成一个以填充下拉列表。我这样做是因为数据来自两种不同的环境

方法是:

    private PeopleContext Peopledb = new PeopleContext();
    private IARContext db = new IARContext();        

    public ViewResult CreateAsset()
        {
        var Posts = (from a in Peopledb.Posts
                     orderby a.PostName
                     where a.Dormant == false
                     select new { a.PostId, a.PostName }).ToArray();

        var owners = from c in db.Owners
                     join a in Posts on c.PostId equals a.PostId
                     select new OwnerPost { OwnerId = c.OwnerId, PostName = a.PostName };

        CreateAssetViewModel viewModel = new CreateAssetViewModel
        {
            Asset = new Asset(),               
            Owners = owners.ToList(),
        };

        return View(viewModel);
    }
viewmodel是:

public class CreateAssetViewModel
    {
    public int AssetId { get; set; }

    public Asset Asset { get; set; }

    [Required]
    [Display(Name = "Owner")]
    public int OwnerId { get; set; }
    public IEnumerable<OwnerPost> Owners { get; set; }

    }

以下代码行存在问题:

Owners = owners.ToList();
在这里,您可以在一系列具有两个属性的匿名类型对象上调用List

而所有者的类型是IEnumerable。也就是说,如果您重构一点linq查询,就会得到您想要的结果

 var owners = from c in db.Owners
              join a in Posts on c.PostId equals a.PostId
              select new Owner { PostId = c.PostId, PostName = a.PostName };
我假设所有者有两个属性,posted和PostName。它可以有更多属性,但至少应该有这两个属性


现在,您的查询返回一个IEnumerable,这是预期的类型。

您不能拥有具有匿名类型属性的强类型。更改所有者查询以返回所有者对象的集合,或创建仅包含所需属性的单独强类型

 var owners = from c in db.Owners
              join a in Posts on c.PostId equals a.PostId
              select new Owner { PostId = c.PostId, PostName = a.PostName };
我遇到异常,无法创建“匿名类型”类型的常量值。在此上下文中仅支持基元类型或枚举类型

原因是您试图将内存中的查询POST注入EF查询。由于不使用POST,因此可以合并查询:

    var owners = from c in db.Owners
                 join a in Peopledb.Post
                     on c.PostId equals a.PostId
                 where a.Dormant == false
                 select new OwnerPost { OwnerId = c.OwnerId, PostName = a.PostName };

我最终通过将代码调整为以下内容解决了这个问题:

视图模型:

    [Required]
    [Display(Name = "Owner")]
    public int OwnerId { get; set; }
    public List<OwnerPost> Owners { get; set; }
控制器:

    [HttpGet]
    public ViewResult CreateAsset()
    {
        var posts = new List<People.Models.Post>(Peopledb.Posts);

        var owners = new List<Owner>(db.Owners);

        var ownerposts = from c in posts
                         join d in owners on c.PostId equals d.PostId
                         select new OwnerPost { OwnerId = d.OwnerId, PostName = c.PostName };

        CreateAssetViewModel viewModel = new CreateAssetViewModel
        {
            Asset = new Asset(),
            Owners = ownerposts.ToList(),
        };

        return View(viewModel);
    }

你选择了新的{},这是一个匿名类,在Christos的回答中,他指定了正确的类选择新的所有者我在所有者中没有PostName的定义,因为我从另一个数据库中的Post中得到了这个问题很清楚,所有者的类型是IEnumerable。所以您的查询必须返回这个。如果没有,则无法将其分配给名为Owners的属性。因此,您应该将linq查询的每个元素投影到所有者对象。这是由“选择新所有者”完成的。然而,我不明白你说你没有PostName的定义是什么意思。如果我没有错,请在查询中填充它。将我的代码更改为重构版本会导致以下错误:“IAR.Models.Owner”不包含“PostName”的定义@Christos@PhillSanders查询的输出不是所有者对象,因为某些属性不匹配。因此,您要么将缺少的属性添加到Owner类,要么根据您试图实现的内容更改查询以返回实际的Owner类class@disklosr已编辑以添加类此问题现在已得到回答。@disklosr恐怕没有,我仍然不知道如何让它工作。我创建了一个OwnerPost类,只包含PostId和PostName属性,然后在查询和viewmodel top OwnerPost中更改了我的类型,但出现了以下错误:无法创建“匿名类型”类型的常量值。此上下文中仅支持基元类型或枚举类型。请使用当前查询更新您的问题,并指出引发错误的位置。
    [Required]
    [Display(Name = "Owner")]
    public int OwnerId { get; set; }
    public List<OwnerPost> Owners { get; set; }
    [HttpGet]
    public ViewResult CreateAsset()
    {
        var posts = new List<People.Models.Post>(Peopledb.Posts);

        var owners = new List<Owner>(db.Owners);

        var ownerposts = from c in posts
                         join d in owners on c.PostId equals d.PostId
                         select new OwnerPost { OwnerId = d.OwnerId, PostName = c.PostName };

        CreateAssetViewModel viewModel = new CreateAssetViewModel
        {
            Asset = new Asset(),
            Owners = ownerposts.ToList(),
        };

        return View(viewModel);
    }