Учитывая это:
public class Article
{
public virtual int ArticleId { get; set; }
public virtual string Title { get; set; }
public virtual string Content { get; set; }
}
public class Meta : IComponent
{
public virtual Article Article { get; set; }
public virtual int MetaId { get; set; }
public virtual string Description { get; set; }
public virtual string Keywords { get; set; }
}
AFAIK, вы не можете выбрать то, что не является частью сущности. Итак, из вашего примера, невозможно получить Meta из сущности Article.
Так что, если вы хотите получить другую информацию о Статье, вам просто нужно присоединить к ней Статью, а затем спроецировать полные данные в вашем Linq, например:
var articles =
from a in s.Query<Article>()
join m in s.Query<Meta>() on a equals m.Article
where m.Keywords.Contains("Some Word")
select new { a, m };
foreach(var x in articles)
Console.WriteLine("{0} {1}", x.a.Title, x.m.Description);
Результирующий запрос:
select *
from [Article] article0_, [Meta] meta1_
where meta1_.ArticleId = article0_.ArticleId
and meta1_.Keywords like '%Some Word%'
Другой подход, начните с Meta, затем загрузите Article; по запросу это немедленно присоединится к статье, то есть без ленивой загрузки:
var artB =
from m in s.Query<Meta>().Fetch(x => x.Article)
where m.Keywords.Contains("Some Word")
select m;
foreach (var x in artB)
Console.WriteLine("{0} {1}", x.Article.Title, x.Description);
Результирующий запрос:
select *
from [Meta] meta0_
left outer join [Article] article1_ on meta0_.ArticleId = article1_.ArticleId
where meta0_.Keywords like '%Some Word%'
Чтобы в Статье была только одна мета, укажите уникальную ссылку на мету:
create table Article
(
ArticleId int identity(1,1) not null primary key,
Title varchar(100) not null,
Content varchar(100) not null
);
create table Meta
(
-- this prevents an Article having two Meta
ArticleId int not null references Article(ArticleId) unique,
MetaId int identity(1,1) not null primary key,
Description varchar(100) not null,
Keywords varchar(100) not null
);
insert into Article(Title,Content) values('Great','Yeah')
insert into Meta(ArticleId, Description, Keywords) values(1,'Oh','Some Word');