【问题标题】:A Problem in Linq expressionLinq 表达式中的一个问题
【发布时间】:2011-05-18 22:26:07
【问题描述】:

这段代码有什么问题? 我在最后一行遇到了这个异常:

无法创建常量值 类型 'System.Collections.Generic.IEnumerable`1'。 只有原始类型('例如 Int32, 支持字符串和 Guid') 这个上下文。

var query = from colT in dal.TBL_Gharardad 
            select colT;  

if(lstTarafeGharardadIds.Count>0)
    query = from q in query 
            join id in lstTarafeGharardadIds on q.TarafeGharardadId equals id 
            select q;

dgvListeGharardad.DataSource = query.ToList();

最后一个TarafeGharardadIds 是List<int>

我也测试了

dgvListeGharardad.DataSource = query;

如果if 表达式等于 false 并且这段代码一切正常

query = from q in query 
        join id in lstTarafeGharardadIds on q.TarafeGharardadId equals id 
        select q;

不运行。但我不明白我在最后一行(在此代码上)得到了错误:

dgvListeGharardad.DataSource = query.ToList();

【问题讨论】:

  • 格式化您的代码,使其可读 - 那么人们可能更有可能阅读它:)
  • 请格式化您的代码以使其更具可读性。如果可能的话,也删除它不必要的部分
  • lstTarafeGharardadIds中的项目类型是什么?

标签: c# linq entity-framework


【解决方案1】:

我认为 linq 无法连接内存中的集合 (lstTarafeGharardadIds) 和数据库表 (dal.TBL_Gharardad, dal.v_Gharardad...)。

类似问题:Why won't this LINQ join statement work?

这应该可行:

var query = (from colT in dal.TBL_Gharardad select colT).AsEnumerable();;
if (lstTarafeGharardadIds.Count>0)
    query = from q in query 
            join id in lstTarafeGharardadIds on q.TarafeGharardadId equals id 
            select q;
dgvListeGharardad.DataSource = query.ToList();

【讨论】:

    【解决方案2】:

    哇,这很难读!

    无论如何,假设您的命名约定是正确的。你最终得到:选择colV。选择一列会导致选择 IEnumerable 而不是您的数据源所需的原始值。

    您可以尝试使用 SelectMany 来选择您需要的实际值

    dgvListeGharardad.DataSource = query.SelectMany(x => x.[YourProperty]).ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      相关资源
      最近更新 更多