在两个表之间使用LINQ加入,只从其中一个表返回记录

时间:2013-04-17 15:23:01

标签: c# sql linq join

这是我的代码:

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之间进行联接,并且希望只有UPC的列表满足WHERE因为我只想向用户显示UPC的列表。我显然做了一些非常错误的事情,因为我得到了这样的信息:

  

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

我认为问题出在我的Linq代码中,特别是select upc; 我怎样才能做我想要完成的事情?

感谢。

1 个答案:

答案 0 :(得分:3)

您的查询是IUPCItem项目的查询,而不是IUIUPCItemShort项目的查询。看起来他们的查询提供程序似乎不知道如何翻译该转换的Cast操作。

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

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

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