2013-03-07 25 views
1

此问题与LINQ到实体有关。在实体LINQ语句内加入集合

我发布了一个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”唉不是。

+0

请包含“blah blah blah”我只能假设它是“ObservableCollection ”以及只在编译器中说的。 – Aron 2013-03-07 14:11:45

+0

阿隆 - 这是observablecollection中包含的类型。谢谢 – xnetdude 2013-03-07 14:14:29

+0

EF无法将Color连续化到SQL中。你需要在.net中查询,而不是在SQL中。 – Aron 2013-03-07 14:16:35

回答

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 
      }; 
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对象的结果。该对象可以像其他任何对象一样使用。

+0

是LINQ实体的新手我希望我可以加入这些不同的数据源,但它似乎不是!感谢您的帮助,请试试看。 – xnetdude 2013-03-07 14:22:00

+0

我得到了与你的第二个linq语句相同的问题,所以我想我会从我的查询中创建一个新的集合,并迭代它以更新颜色的文本值,除非有更有效的方法。 – xnetdude 2013-03-07 14:29:30

+0

@xnetdude - 究竟是什么问题?抛出什么异常? – ken 2013-03-07 17:35:25