Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架子查询_C#_Entity Framework_Linq To Entities - Fatal编程技术网

C# 实体框架子查询

C# 实体框架子查询,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,伙计们,我是实体框架的新手,我有一个问题,我已经尝试解决了很长一段时间。基本上我有4个实体:用户、组、书籍和阅读列表。用户可以加入一个组,该组包含由readingList定义的书籍。我试图显示特定组的书籍列表,SQL如下所示: SELECT * FROM Books b WHERE b.Id IN ( SELECT BookID FROM ReadingList rl WHERE rl.GroupID = '3') // Get books by group publi

伙计们,我是实体框架的新手,我有一个问题,我已经尝试解决了很长一段时间。基本上我有4个实体:用户、组、书籍和阅读列表。用户可以加入一个组,该组包含由readingList定义的书籍。我试图显示特定组的书籍列表,SQL如下所示:

SELECT * FROM Books b
WHERE b.Id IN (
    SELECT BookID FROM ReadingList rl
        WHERE rl.GroupID = '3')
// Get books by group
public IQueryable<Book> GetGroupBooks(string username)
{
    UserRepository userRepository = new UserRepository();
    int groupId = userRepository.GetUserGroupId(username);

    IQueryable<Book> q = from b in entities.Books 
                         where b.Id == 7 // temp - these values should be determined by 
                                         // rl in entites.ReadingList select rl.BookID where r.GroupID == groupID
                         select b;

    return q;
}
我通过从UserRepository查询当前用户来确定正在搜索的GroupID,当前的“按组获取书籍”方法如下所示:

SELECT * FROM Books b
WHERE b.Id IN (
    SELECT BookID FROM ReadingList rl
        WHERE rl.GroupID = '3')
// Get books by group
public IQueryable<Book> GetGroupBooks(string username)
{
    UserRepository userRepository = new UserRepository();
    int groupId = userRepository.GetUserGroupId(username);

    IQueryable<Book> q = from b in entities.Books 
                         where b.Id == 7 // temp - these values should be determined by 
                                         // rl in entites.ReadingList select rl.BookID where r.GroupID == groupID
                         select b;

    return q;
}
//按组获取书籍
公共IQueryable GetGroupBooks(字符串用户名)
{
UserRepository UserRepository=新的UserRepository();
int-groupId=userRepository.GetUserGroupId(用户名);
IQueryable q=来自entities.Books中的b
其中b.Id==7//temp-这些值应由
//在entites.ReadingList中选择rl.BookID,其中r.GroupID==GroupID
选择b;
返回q;
}
显然,这是一个临时措施,只返回一本书,但我已经包括它作为参考。如果您有任何帮助或建议,我们将不胜感激


谢谢

我还没有测试它,但希望它能工作

entities.Books.Where(
b => entities.ReadingList.
Where(rl => rl.GroupId == groupId).
Select(rl => rl.BookId).
Contains(b.BookId)
)

我个人认为有一个更好的解决方案(当然没有经过测试):

首先由GroupdID从ReadList中选择,然后加入BookID上的书籍

IQueryable<Book> q = 
       from rl in entities.ReadingList
       join b in entities.Books on rl.BookID equals b.BookID
       where rl.GroupdID ==groupID
       select b;

var books = q.ToList()
IQueryable q=
从entities.ReadingList中的rl
将b加入实体。rl.BookID上的图书等于b.BookID
其中rl.GroupdID==groupID
选择b;
var books=q.ToList()

如果您有任何问题,请告诉我。

您是否在书籍和阅读列表之间有FK?非常感谢!这非常有效,非常感谢你的时间。你可能想解释一下你在这里做什么,因为这没有效率。您正在执行子查询,但将对每本书执行子查询。我应该添加ReadingList包含两个FK,一个到书,一个到组。ReadingList包含一个复合PK(BookID和GroupID),确保同一组的书不能出现一次以上。@Nix AFAIK,编译器足够聪明,能够理解如何优化该过程。因此,子查询不会针对每本书执行,而是首先检查内存中的特定组。编译器不会在幕后执行它。首先是从数据库中提取,其余的是内存搜索。我相信你不会有太多的数据,所以这不会是一个问题,但我觉得应该注意一下。+1表示更详细的方法。就我个人而言,我更喜欢速记法。:)但是为什么
是不同的
?你是对的,因为某种原因我在考虑阅读列表。。不需要它。
Distinct
用于消除重复的书籍,因为它可能会被返回多次。