【问题标题】:Cast linq results to List<MyInterface>将 linq 结果转换为 List<MyInterface>
【发布时间】:2009-09-01 07:42:34
【问题描述】:

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

 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 仅支持转换实体数据模型基元类型”

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

这可能吗?

【问题讨论】:

    标签: linq entity-framework linq-to-entities


    【解决方案1】:

    你可以在客户端做cast,通过调用AsEnumerable扩展方法绕过实体框架查询翻译层:

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

    但是,最好颠倒执行Count 检查的顺序:

    var list = results.AsEnumerable().Cast<IApplicationEntity>().ToList();
    return list.Count == 0 ? null : list;
    

    【讨论】:

    • +1,但是这将执行两个数据库查询(对于 Count 和对于 ToList)...之前调用 ToList 可能会更好,然后检查项目数
    • @Thomas:看第二个查询。
    • 感谢您使用简单的方法(例如检查计数的方式)提高了效率!
    【解决方案2】:

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

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

    尝试以下方法:

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

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

    【讨论】:

    • 其实这行不通。您应该在演员阵容之前进行AsEnumerable。否则,EF 将尝试将其转换为要在提供程序上运行的查询。
    • @Mehrdad:太快了,不利于你自己。我在你发表评论之前编辑了这篇文章。 ;)
    【解决方案3】:
    return results.Count() > 0 ? 
    results.Select(result => (IApplicationEntity)result)
    .ToList() : null;
    

    【讨论】:

    • 我认为它不会起作用,原因与 Cast 方法不起作用的原因相同。您需要先将查询转换为 IEnumerable
    • 消息指出它不知道如何将 linq 中的 Cast() 运算符转换为实体。这实际上是由 linq 提供者的提供者编写的代码(例如,Linq to Sql、linq to Objects 等)。其他发帖人建议更改对 AsEnumerable 的调用以强制使用 Linq to Objects 并因此具有 Cast () 运算符成功。我正在做同样的事情,但使用 C# 而是通过将强制转换显式投影到代码中。试试看,让我知道它是否有效。
    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多