代码之家  ›  专栏  ›  技术社区  ›  James

将LINQ结果强制转换为list<myinterface>

  •  8
  • James  · 技术社区  · 15 年前

    我已经扩展了我的实体来实现其类型的特定接口。我正在尝试执行以下查询:

     var results = from x in context.MyEntityTable
                   where x.AProperty == AValue
                   select x;
    
     return results.Count() > 0 ? results.Cast<IApplicationEntity>().ToList() : null;
    

    但是,我一直得到以下错误:

    “Linq to Entities仅支持强制转换实体数据模型基元类型”

    基本上,我要做的就是将原始实体类型的结果转换为它实现的接口的通用列表。

    这有可能吗?

    3 回复  |  直到 12 年前
        1
  •  20
  •   Mehrdad Afshari    12 年前

    您可以在客户机上执行强制转换,通过调用 AsEnumerable 扩展方法:

    return results.Any()
           ? results.AsEnumerable().Cast<IApplicationEntity>().ToList() 
           : null;
    

    但是,最好是颠倒 Count 检查:

    var list = results.AsEnumerable().Cast<IApplicationEntity>().ToList();
    return list.Count == 0 ? null : list;
    
        2
  •  3
  •   Noldorin    15 年前

    如果要将结果强制转换为复杂类型,则需要强制代码使用LINQ to对象,而不是LINQ to实体。

    调用 AsEnumerable 在强制转换之前的扩展方法就是这里的诀窍。

    尝试以下操作:

    var results = from x in context.MyEntityTable
                  where x.AProperty == AValue
                  select x;
    
    return results.AsEnumerable().Cast<IApplicationEntity>().ToList();
    

    还要注意,检查是不明智的 Count() 在可枚举的上,因为这意味着集合被迭代两次。

        3
  •  0
  •   Spence    15 年前
    return results.Count() > 0 ? 
    results.Select(result => (IApplicationEntity)result)
    .ToList() : null;