【问题标题】:Cannot implicitly convert type IEnumerable to IQueryable with Entities无法使用实体将类型 IEnumerable 隐式转换为 IQueryable
【发布时间】:2014-06-19 10:22:13
【问题描述】:

我对 Entity 完全陌生(我已经接管了另一个人的项目),因此我错过了一些关键事实,但我会尝试解释我的问题:

我的申请人有一个表格,其中包含他们的名字等信息。我也有一个包含 ASP.NET 用户的表格。这些表由 user_id 链接。

我正在尝试将登录名设置为下拉列表中的可选列表项,但为此我需要加入这两个表。我写了以下代码:

var container = new ModelContainer();
var manager = new ApplicantDBManager();

IEnumerable<Business.Entities.EF.Applicant> applicantQuery;

if (txtSearch.Text.Equals(string.Empty))
{
    applicantQuery = container.Applicants;
}
else
{
    var ids = manager.ApplicantSearchForIDs(ddlSearch.SelectedValue, txtSearch.Text, chkIncludeInactive.Checked);

    applicantQuery = (from a in container.Applicants
                      join u in container.Users on a.user_id equals u.user_id
                      where ids.Contains(a.user_id)
                      select new
                      {
                          user_id = a.user_id,
                          first_name = a.first_name,
                          last_name = a.last_name,
                          login_name = u.login_name,
                          date_of_birth = a.date_of_birth,
                          kot_cpr = a.kot_cpr,
                          address = a.address,
                          email = a.email,
                          telephone_number = a.telephone_number,
                          citizenship = a.citizenship
                      });
}

我收到一个错误,例如“无法将类型 System.Linq.Iqueryable 隐式转换为 System.Collections.Generic.IEnumerable”,而且我如何尝试修复它似乎并不重要(我尝试添加 .ToList() .AsQueryable()、First() 等没有运气)。我认为这与申请人实体有关?

【问题讨论】:

  • 我 99.9% 确定这不是您收到的 exact 错误消息 - 我怀疑确切的错误消息将包含类型参数,表明 @ 987654322@ 有一个匿名类型参数,而它试图转换为IEnumerable&lt;Business.Entities.EF.Applicant&gt;。这些事情很重要:始终将错误消息直接复制并粘贴到问题中,以避免丢失重要信息。

标签: c# asp.net linq


【解决方案1】:

这就是问题所在:

select new 
{
    ...
}

那是创建一个匿名类型的实例。你希望它如何创建一个Business.Entities.EF.Applicant 对象?

您可能只是需要将您的代码更改为:

select new Business.Entities.EF.Applicant
{
    ...
}

【讨论】:

  • @ChristianHansenNørgaard:如果结果是Applicant 结果的序列,为什么要指定不属于Applicant 的属性?为什么不直接删除该属性...无论如何,您将无法从结果中使用它...
  • 我想我并没有完全理解它是如何工作的。我需要表 aspnet_Users 中的用户名,这就是为什么我试图像普通的连接查询一样加入 2 个表,我认为我可以将它包含在我的结果中,这样我就可以将 i 与所有申请人信息一起添加到 gridview 中。
  • @ChristianHansenNørgaard:这么说吧——你的查询当前是IEnumerable&lt;Applicant&gt;。这是否包含您需要的所有信息?如果没有,你需要别的东西。 (想想if 的另一边——那里只有申请人......)
  • 我终于想通了。我必须创建一个新类并在一个完全不同的文件中更改正确的查询,而不是这个。我开始了解整个实体的东西,看起来原始程序员首先编写代码。
【解决方案2】:

您需要更改代码。把代码改成

select new Business.Entities.EF.Applicant
{
user_id = a.user_id,
first_name = a.first_name,
last_name = a.last_name,
login_name = u.login_name,
date_of_birth = a.date_of_birth,
kot_cpr = a.kot_cpr,
address = a.address,
email = a.email,
telephone_number = a.telephone_number,
citizenship = a.citizenship
}

【讨论】:

    【解决方案3】:

    select new 返回匿名类型对象,而applicantQueryBusiness.Entities.EF.Applicant 类型。所以,就像 Jon Skeet 说的,返回预期类型的​​对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多