在Entity LINQ语句中加入集合

时间:2013-03-07 14:01:29

标签: c# linq linq-to-entities

此问题与LINQ-to-entity有关。

我发布了一个similar question,但是如果没有答案就会让人感到困惑,所以我提供了一个示例和一个新的帮助。

我有一个包含ObservableCollection的“颜色”类,其中包含两个成员IndexName,其填充方式如下:

0 - 红色
 1 - 蓝色
 2 - 绿色

我有一个数据库表,其中包含我喜欢的颜色的整数列表。我想根据存储在数据库中的索引值返回一个查询,其中包含我喜欢的颜色的整数值以及匹配的名称(由observablecollection返回)。

这个单独的语句工作正常并返回我的颜色名称: -

string ColorName = Colors.Names.Where(x => x.Index == 1).FirstOrDefault().Name;

但是当包含在LINQ到实体查询中时: -

var query = from c in context.FavoriteColor
select (new Item
    {
        Id = c.Id,
      ColorName = Colors.Names.Where(x => x.Index == c.ColorIndex).FirstOrDefault().Name
    });

我收到此错误:

  

无法创建“blah blah”类型的常量值。只有原始   这里支持类型(例如Int32,String和Guid')   上下文。

据我所知,也许该对象是在LINQ语句中返回的,但我想通过在末尾指定.Name表示法,这是一个字符串成员,它会使用它并将其分配给“ColorName”,唉不行。

2 个答案:

答案 0 :(得分:0)

你试过了吗?

var query = from c in context.FavoriteColor
            select new { c.Id, c.ColorIndex };
var result = from c in query.ToList()
             select new Item
             {
                 Id = c.Id,
                 ColorName = Colors.Names.Where(x => x.Index == c.ColorIndex).FirstOrDefault().Name
             };

答案 1 :(得分:0)

您正在尝试在数据库查询中使用CLR对象。 LINQ-to-Entities说你做不到。查询完成后获取颜色名称。

var dbItems = context.FavoriteColor.Select(c => new {
    c.Id,
    c.ColorIndex
).ToList();

var items = dbItems.Select(item => new Item {
    Id = item.Id,
    ColorName = Colors.Names.Where(x => x.Index == item.ColorIndex).First().Name
})

这里的想法是对ToList的调用命中数据库并在CLR对象中返回结果。然后可以像使用任何其他对象一样使用该对象。