关于LINQ的问题

时间:2010-07-30 15:47:50

标签: linq linq-to-sql

我在SqlServer中有三个表(相当于SQL Server中链接中的图像)

http://www.mojoimage.com/free-image-hosting-view-06.php?id=2Untitled-2.gif

当我使用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的类,它实现了“Video”接口和“Item”接口:

class VideoItem:IItem,IVideo
{
public Guid ItemId;
public int ItemSize;
public string Resolution;
}

和一个名为AudioItem的类,它实现了“Audio”接口和“Item”接口。

class AudioItem :IItem,IVideo
{
public Guid ItemId;
public int ItemSize;
public int Duration;
}

现在我想使用LINQ从我的表中查询VideoItem实例(这些实例都在Item表和Video表中)。

我是否需要创建自定义LINQ提供程序?

2 个答案:

答案 0 :(得分:0)

from ai in Audio
where ai.XXXX == whatever
select new AudioItem
    {
        ItemId = ai.ItemId,
        ItemSize = ai.Item.ItemSize,
        Duration = ai.DUration
    }

这假设您在Item&amp ;;之间设置了外键关联。基于ItemId的音频。如果没有,你将不得不:

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
    }

更新:你可以像这样创建一个AUdioItem列表:

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;

答案 1 :(得分:0)

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