2015-08-03 2 views
0

У меня есть две таблицы: Questions и Educations, между этими таблицами нет никакого отношения.LINQ, выберите один из нескольких таблиц

Как я могу выбрать комбинацию последних 10 (по дате) из обеих таблиц?

enter image description here

+2

Можете ли вы уточнить? Atleast показывает имена столбцов из каждой таблицы. –

+5

Если между таблицами нет никакой связи, как мы должны выбрать «комбинацию»? И что еще более важно, как на небесном имени у этого q было 5 upvotes: | – Jamiec

+0

Вы можете выполнить [join] (http://stackoverflow.com/questions/16025287/entity-framework-query-for-inner-join) – jrummell

ответ

0

Вы хотите что-то вроде

var result = questions.OrderByDescending(i => i.id).Take(5).Union(education.OrderByDescending(i => i.id).Take(5)); 
+0

Это не сработало бы, если бы было 10 из одной таблицы, а 0 из другой –

+0

Я действительно сказал «нравится»: P, поскольку я выбрал ID, но не слишком – BugFinder

+0

не содержит определения для 'OrderByDescending' – prince

0

В LINQ вы не можете соединить две таблицы с уплотнительными отношениями, которые будут необходимы для преформ запроса. Вам лучше было бы сделать два запроса LINQ to SQL, чтобы выбрать последние 10 из каждой таблицы в подобную структуру, а затем взять эти два перечисления, сделать объединение и взять последние 10 из них.

Если вы использовали структуру, как:

public struct QuestionsEducationsJoin 
{ 
    public DateTime date; 
    public int QuestionID; 
    public string Question;//...; 
    public int EducationID; 
    public string Education;//...; 
} 

Вы можете выбрать один из двух таблиц в этой структуре:

var questionEnumeration = database.Questions 
    .OrderByDescending(question => question.DateField) 
    .Take(10) 
    .Select(question => new QuestionsEducationsJoin() 
     { 
      date = question.DateField; 
      //... 
     }); 

var educationEnumeration; //... 

var outputEnumeration = questionEnumberation 
    .Union(educationEnumeration) 
    .OrderByDescending(x => x.date) 
    .Take(10); 
0

Ответ зависит от того, или не нужно результирующий список будет полиморфный (список объектов, которые совместно используют общий интерфейс, подвергая общими свойствам, которые нужно манипулировать) или простой список объектов, которые вы нелегко знаете, как отличать.

Если есть области, общие для обоих, с которыми вы хотите работать, создайте интерфейс этих общих атрибутов и оба класса реализуют интерфейс. Например, интерфейс может быть

Interface iBrainStuff 
{ 
    public DateTime DateCreated; 
    public int AreaOfExpertise; 
    public string Description; 

} 

Тогда вы просто реализовать интерфейс в каждом классе:

public class question: iBrainStuff 


public class education: iBrainStuff 

Затем вы создаете свой список результатов

List<iBrainStuff> results = new List<iBrainStuff>(); 

тогда

results.AddRange(context.educations.OrderByDescending(x => x.DateCreated).Take(5); 

results.AddRange(context.questions.OrderByDescending(x => x.DateCreated).Take(5); 

И что pu ts в первую десятку (по 5 от каждого) в списке результатов. И результаты в списке результатов могут быть опрошены для полей интерфейса iBrainStuff:

Interface iBrainStuff 
{ 
    public DateTime DateCreated; 
    public int AreaOfExpertise; 
    public string Description; 

} 
Смежные вопросы