【问题标题】:Error: Only primitive types or enumeration types are supported in this context EF错误:此上下文 EF 中仅支持原始类型或枚举类型
【发布时间】:2015-02-09 09:01:05
【问题描述】:

这段代码一直在犯这个错误。 :

无法创建“Repository.DBModel.Subscriber”类型的常量值。此上下文仅支持原始类型或枚举类型。

我已经更改了几次,但一直出现此错误。

using (SubscriberDBHandler db = new SubscriberDBHandler())
{
    IEnumerable <Subscriber> NewSubscribers = Subscribers
                                              .Where(sub => db.Subscriber
                                              .Any(aSub => !aSub.Email.Equals(sub.Email)));
    List<Subscriber> updateSubscribers = db.Subscriber
                                           .Where(dbSub => Subscribers
                                           .Any(lSub => lSub.Email
                                           .Equals(dbSub.Email))).ToList();
    if(NewSubscribers.Count() >= 1)
    {
        db.Subscriber.AddRange(NewSubscribers);
    }
    updateSubscribers.ForEach(aSub => aSub.State = Subscribers
                                                  .FirstOrDefault(sub => sub.Email
                                                  .Equals(aSub.Email)).State ?? "Error" );
    db.SaveChanges();
}

如果有人能指出我的错误或想出更有效的方法来做到这一点,我将不胜感激。

提前感谢您的时间和帮助。


我知道有一些帖子存在此错误,但在阅读它们时,我无法弄清楚它们与我的问题有何关系。所以如果这是一个常见错误并且其他人提供了解决方案,我很抱歉

对象订阅者是List&lt;Subscriber&gt;

我似乎无法找到线路但是。堆栈跟踪确实包含这个。

在 System.Linq.Enumerable.ToList[TSource](IEnumerable1 source) at Repository.SubScribRepository.AddOrUpdateSubscribers(List1 订阅者)

【问题讨论】:

  • 您好,请在格式化您的代码(适当的缩进等)、删除注释掉的代码并让我们知道错误发生在哪一行。
  • 这个对象“订阅者”是什么类型的?或者请发布实体模型。

标签: c# entity-framework lambda


【解决方案1】:

您直接在 LINQ 语句中使用本地集合 Subscribers。但是这些对象不能翻译成 SQL。只有原始类型到数据库类型的映射。

我建议你使用

var emails = Subscribers.Select(s => s.Email).ToList();

然后在Contains 语句中使用这些字符串(即原始值),例如:

var newSubscribers = db.Subscriber
                       .Where(dbSub => !emails.Contains(dbSub.Email))
                       .ToList();
var updateSubscribers = db.Subscriber
                          .Where(dbSub => emails.Contains(dbSub.Email))
                          .ToList();

【讨论】:

  • 我知道我会改成这个,看看我的问题是否仍然存在。只是要清楚。我的错误是不能在 LINQ 语句中使用 List 订阅者,因为无法转换为原始类型。即使您是从 DB 表示类创建的 Subscriber 对象。?
  • 是的,这是因为实体对象(例如 Subscribers)只能在 LINQ 中使用,前提是它们是 LINQ 表达式的一部分,例如 context.Subscribers。当它们在本地内存中时,无法从它们创建 SQL。就像 context.Subscribers.Where(s =&gt; s == localSubscriberObject) - 很难把它变成 SQL。
  • 电子邮件地址可能太多?尝试让this 可扩展的包含方法工作。
  • 我会说我们收到了大约 70000 行电子邮件,所以是的,我认为在阅读您提供的链接后这可能是一个问题再次感谢 :)
【解决方案2】:

将 updateSubscribers 更改为 IEnumerable 将防止此错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多