LINQ: предварительная выборка данных из второй таблицы - PullRequest
1 голос
/ 21 сентября 2009

Я пытаюсь предварительно извлечь некоторые данные внешнего ключа, используя запрос linq. Вот быстрый пример, объясняющий мою проблему:

var results = (from c in _customers
               from ct in _customerTypes 
               where c.TypeId == ct.TypeId 
               select new Customer
                          {
                             CustomerId = c.CustomerId,
                             Name = c.Name,
                             TypeId = c.TypeId,
                             TypeName = ct.TypeName,  <-- Trying to Prefetch this
                          }).ToList();

Класс Customer выглядит следующим образом:

[Table(Name = "Customers")]
public class Customer
{
   [Column(Name = "CustomerId", IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
   public int CustomerId { get; set; }

   [Column(Name = "Name")]
   public string Name { get; set; }

   [Column(Name = "TypeId")]
   public int TypeId { get; set;}

   public string TypeName { get; set; }

   public Confession (){}
}

Однако LINQ не позволит вам сделать это, выдав исключение NotSupportedException с «Явное построение типа объекта« Клиент »в запросе не допускается».

Я явно неправильно подхожу к этому. Любые указатели в правильном направлении были бы наиболее полезны.

Ответы [ 2 ]

1 голос
/ 21 сентября 2009

Как говорится, вы не можете построить там клиента.

(возможно) проще всего было бы создать новый класс, который инкапсулирует нужные вам свойства. Вы можете получить все из класса Customer, выполнив это так:

var results = (from c in _customers
               from ct in _customerTypes 
               where c.TypeId == ct.TypeId 
               select new
                      {
                         Customer = c,
                         TypeName = ct.TypeName
                      }).ToList();
0 голосов
/ 21 сентября 2009

Если вы хотите выполнить подлинную предварительную загрузку, вы можете сделать следующее:

(Предполагается, что в вашей базе данных есть соединение между таблицами Customer и CustomerType и что LINQ to SQL знает об этом.)

MyDataContext dc = new MyDataContext(); // Use your application-specific DataContext class
DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Customer>(c => c.CustomerType);
dc.LoadOptions = loadOptions;
var results = from c in dc.GetTable<Customer>() select c;

Затем вы можете получить доступ к TypeName таким образом (где c - это Customer в results):

c.CustomerType.TypeName;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...