无法将“LINQ Join”与其他表结合使用

时间:2011-01-07 21:24:21

标签: linq linq-to-sql

主要问题是我收到以下消息:

“base {System.SystemException} = {”无法创建类型为'BokButik1.Models.Book-Author'的常量值。在此上下文中仅支持原始类型(例如Int32,String和Guid')。“}”

基于此LinQ代码:

  

IBookRepository myIBookRepository = new BookRepository();
  var allBooks = myIBookRepository.HamtaAllaBocker();

     

IBok_ForfattareRepository myIBok_ForfattareRepository = new Bok_ForfattareRepository();
  var Book-Authors =   myIBok_ForfattareRepository.HamtaAllaBok_ForfattareNummer();

     

var q =
  来自booknn in allBooks
          在Booknn.BookID等于Book-Authors中加入Book-Authornn           书Authornn.BookID
          选择新的{booknn.title,Book-AuthorID};

如何解决此问题以获取包含属性标题和Book-AuthorID的类实例?

// Fullmetalboy

我也试过通过使用来自地址http://www.hookedonlinq.com/JoinOperator.ashx的代码样本的“allbooks”关系来制作一些虚拟对象。不幸的是,仍然存在同样的问题。

由于实体框架http://msdn.microsoft.com/en-us/library/bb896317.aspx,我还考虑了Int32。不幸的是,还有同样的问题。

使用带有3个表的数据库,其中一个表是多对多的关系。该数据库与实体框架

有关

书本作者

书籍作者(int)
BookID(int)
Forfattare(int)

BookID(int)
标题(字符串)
等等等

1 个答案:

答案 0 :(得分:0)

您似乎正在使用两个单独的linq-to-sql存储库来加入。这不行。联接只能在单个存储库中定义的表之间工作。

但是,如果您乐意将所有数据放入内存中,那么很容易使代码正常工作。试试这个:

var myIBookRepository = new BookRepository();
var myIBok_ForfattareRepository = new Bok_ForfattareRepository();

var allBooks =
    myIBookRepository.HamtaAllaBocker().ToArray();

var Book_Authors =
    myIBok_ForfattareRepository.HamtaAllaBok_ForfattareNummer().ToArray();

var q =
    from booknn in allBooks
    join Book_Authornn in Book_Authors
        on booknn.BookID equals Book_Authornn.BookID
    select new { booknn.title, Book_AuthorID = Book_Authornn.Book_Author };

请注意包含两个.ToArray()来电。

我不得不修改一些变量名称,我对获取作者ID做了一些猜测。

这对你有用吗?

我建议只有一个存储库并允许正常连接 - 将所有对象加载到内存中可能很昂贵。

如果您正在制作自定义存储库,您还可以考虑制作一个自定义方法,将标题和作者ID作为已定义的类而不是匿名类返回。为了更好的可测试性。