【问题标题】:Join using LINQ between two tables, return records from only one of them在两个表之间使用 LINQ 连接,仅从其中一个返回记录
【发布时间】:2013-04-17 15:23:01
【问题描述】:

这是我的代码:

public IEnumerable<IUIUPCItemShort> GetActiveWithDefaultCost()
    {
        var query = from upc in DataManagerFactory.Get().Manage<IUPCItem>().GetAll()
                    join inv in DataManagerFactory.Get().Manage<IInventory>().GetAll() on upc.UPCID equals inv.UPCID
                    where inv.ExitDate == null
                         && upc.UnitCost == null
                    select upc;
        return
            query.Cast<IUIUPCItemShort>().ToList();

基本上,我正在尝试在 UPCInventory 两个表之间进行联接,并且希望仅列出满足 WHERE 条件的 UPC 列表,因为我只想显示用户UPC 的列表。我显然做错了什么,因为我收到了这条消息:

无法将“System.Linq.Expressions.MethodCallExpressionN”类型的对象转换为“SubSonic.Linq.Structure.ProjectionExpression”类型。

我认为问题出在我的 Linq 代码中,特别是在 select upc; 我该如何做我想要完成的事情?

谢谢。

【问题讨论】:

    标签: c# sql linq join


    【解决方案1】:

    您的查询是对 IUPCItem 项目的查询,而不是对 IUIUPCItemShort 项目的查询。他们的查询提供者似乎不知道如何为该转换转换 Cast 操作。

    如果您知道 C# 代码中的 IUPCItem 可以转换为 IUIUPCItemShort,那么您可能只是想避免让查询提供程序尝试处理 Cast。确保它是在 Linq 中完成的对象,如下所示:

    return query.AsEnumerable().
        Cast<IUIUPCItemShort>()
        .ToList();
    

    如果这不起作用,则意味着该类型确实不可隐式转换;您需要确定如何从IUPCItem 正确获取IUIUPCItemShort 的实例,可能创建一个方法来处理您使用Select 调用的转换。

    【讨论】:

    • 添加 AsEnumerable() 做到了。我认为这将是一件如此简单的事情,但你为我节省了几个小时的研究和反复试验。谢谢!
    猜你喜欢
    • 2012-06-05
    • 2020-06-29
    • 2013-12-22
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2016-04-03
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多