关于LINQ的问题

关于LINQ的问题,linq,linq-to-sql,Linq,Linq To Sql,我在SqlServer中有三个表,相当于SqlServer中下面链接中的图像 当我使用LINQ to Sql时,dbml文件中有三个类: class Item { Guid ItemId; int ItemSize; } class Video { Guid RecordId; Guid ItemId; string Resolution; } class Audio { Guid RecordId; Guid ItemId; int Duration; } 然后我创建这三个接口: Int

我在SqlServer中有三个表,相当于SqlServer中下面链接中的图像

当我使用LINQ to Sql时,dbml文件中有三个类:

class Item
{
Guid ItemId;
int ItemSize;
}

class Video
{
Guid RecordId;
Guid ItemId;
string Resolution;
}

class Audio
{
Guid RecordId;
Guid ItemId;
int Duration;
}
然后我创建这三个接口:

Interface IItem
{
Guid ItemId;
int ItemSize;
}

Interface IVideo
{
string Resolution;
}

Interface IAudio
{
int Duration;
}
以及一个名为VideoItem的类,该类实现了视频接口和项接口:

class VideoItem:IItem,IVideo
{
public Guid ItemId;
public int ItemSize;
public string Resolution;
}
和一个名为AudioItem的类,该类同时实现音频接口和项接口

class AudioItem :IItem,IVideo
{
public Guid ItemId;
public int ItemSize;
public int Duration;
}
现在我想使用LINQ从我的表中查询VideoItem实例,这些表同时位于Item表和Video表中

我需要创建自定义LINQ提供程序吗

from ai in Audio
where ai.XXXX == whatever
select new AudioItem
    {
        ItemId = ai.ItemId,
        ItemSize = ai.Item.ItemSize,
        Duration = ai.DUration
    }
这假设您已基于ItemId在Item和Audio之间设置了外键关系。如果没有,您将不得不选择:

from ai in Audio
join i in Item on ai.ItemId equal i.ItemiD
where ai.XXXX == whatever
select new AudioItem
    {
        ItemId = ai.ItemId,
        ItemSize = i.ItemSize,
        Duration = ai.DUration
    }
更新:您可以创建音频项目列表,如下所示:

var listOfAudioItems =
(from ai in Audio
where ai.XXXX == whatever
select new AudioItem
    {
        ItemId = ai.ItemId,
        ItemSize = ai.Item.ItemSize,
        Duration = ai.DUration
    }).ToList();
一旦有了它,就可以在LINQ状态下将其作为单个表使用:

 from ai in listOfAudioItems
 where ai.Duration > 5 && ai.ItemSize == 10
 select ai;

@James提供的解决方案将比编写自定义LINQ提供程序容易得多。您可以通过使用LINQ查询连接两个表并分别选择结果作为AudioItem或VideoItem来选择两个实体之间的连接。

谢谢,但我想使用VideoItem和AudioItem,如下所示:从上下文中的Vi。VideoItems select。。。不是从单独的表中,而是从单独的表中。你必须先单独处理它们。这些查询将创建一个列表,然后您可以将其作为单个表来处理?我想你想要的是一个定制的提供者,但这将是一个巨大的任务,仅仅是为了避免创建外键关系。因为这是我的数据层的一部分,我想封装所有这些东西,让用户只做一个选择…有没有一种简单的方法来创建自定义LINQ提供程序为这类问题我有?因为这是我想要的一部分或我的数据层要封装所有这些内容并让用户只需一个选择…有没有一种简单的方法可以为我遇到的此类问题创建自定义LINQ提供程序?LINQ提供程序将需要太多的工作,并且可能不会很容易获得您想要的好处。。。NET实体框架为您提供了更多的选择来开发通用的DAL组件。。。