【问题标题】:Join collection inside an Entity LINQ statement在 Entity LINQ 语句中加入集合
【发布时间】:2013-03-07 14:01:28
【问题描述】:

这个问题与 LINQ-to-entity 相关。

我发布了一个similar question,但没有答案就让人困惑,所以我提供了一个例子和一个新的呼救声。

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

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

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

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

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

但是当包含在 LINQ-to-entity 查询中时:-

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”,可惜不是。

【问题讨论】:

  • 请包含“blah blah blah” 我只能假设它是“ObservableCollection”,只有在编译器中才能使用。
  • Aron - 它是 observablecollection 中包含的类型。谢谢
  • EF 无法将 Color 序列化为 SQL。您需要在 .net 而不是 SQL 中进行查找。
  • 是的,这正是我得出的结论。我担心我将不得不迭代集合并更新该循环中的颜色。只是看起来有点乱。

标签: c# linq linq-to-entities


【解决方案1】:

你试过了吗:

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
             };

【讨论】:

    【解决方案2】:

    您正试图在数据库查询中使用 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 对象中返回结果。然后可以像使用任何其他对象一样使用该对象。

    【讨论】:

    • 刚接触 LINQ-to-entities 我希望我可以加入这些不同的数据源,但似乎不行!感谢您的帮助,会试一试。
    • 我在你的第二个 linq 语句中遇到了同样的问题,所以我想我将从我的查询中创建一个新集合并迭代它以更新颜色的文本值,除非有更多有效的方式。
    • @xnetdude - 到底是什么问题?抛出的异常是什么?
    • 嗨 - 我收到了与之前在我的操作中提到的相同的错误,但我认为我做的不正确。
      我现在通过将代码移动到 setter 中解决了这个问题在 linq 期间创建的对象。我现在正在“查找”那里的 clr 对象。
      感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-01-22
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多