将表int id存储到ViewModel类的int []属性中

时间:2017-05-30 19:08:30

标签: c# asp.net-mvc entity-framework linq-to-entities

我想从联合表的列中提取所有int ID并将其存储在ViewModel类的属性中。

注意:CategorisationFooBar实体类的映射表。在这种情况下,我只过滤Id Foo个。{/ p>

var model = _ctx.FooDbSet.Where(y => y.Id == x.Id).Select(x => new FooManageVM
        {
            // ... other attributes here

            CategorisationIds = _ctx.CategorisationDbSet.Where(w => w.Foo.Id == id).Select(s => s.Foo.Id).ToArray()

        }).Single();

虽然最后有.ToArray()方法(.ToArray<int>()也不起作用),但我收到此错误:

LINQ to Entities does not recognize the method 'Int32[] ToArray[Int32](System.Collections.Generic.IEnumerable`1[System.Int32])' method, and this method cannot be translated into a store expression.

我尝试将查询提取到上面,例如:

var ids = _ctx.CategorisationDbSet.Where(w => w.Foo.Id == id).Select(s => s.Foo.Id);

然后在下面:

// this is of type int[]
CategorisationIds = ids.ToArray()

但这也不起作用。

3 个答案:

答案 0 :(得分:1)

我认为最简单的方法是将CategorisationsIds的类型更改为IEnumerable<int>

另外,请检查您是否引用了System.Linq

但如果这不起作用,您可以查询匿名对象并使用.Single()的结果实例化FooManageVM:

var result = _ctx.FooDbSet.Where(y => y.Id == x.Id).Select(x => 
    {
        // ... other attributes here

        CategorisationIds = _ctx.CategorisationDbSet.Where(w => w.Foo.Id == id).Select(s => s.Foo.Id)

    }).Single();

var model = new FooManageVM {
     // ... other attributes here
     CategorisationIds = result.CategorisationIds.ToArray();
}

答案 1 :(得分:0)

.ToArray()电话移至主要查询

之外

尝试:

var ids = _ctx.CategorisationDbSet.Where(w => w.Foo.Id == id).Select(s => s.Foo.Id).ToArray();

然后:

CategorisationIds = ids;

答案 2 :(得分:-2)

首先使用ToList():

.Select(s => s.Foo.Id).ToList().ToArray()

当您使用ToList从DB提取的记录并准备好作为linq对象时。