2009-02-26 5 views
5

Я написал приложение, которое я использую в качестве агента для запроса данных из базы данных и автоматически загружаю его в свой распределенный сетевой кеш ,LINQ-to-SQL: ExecuteQuery (Type, String) заполняет одно поле, но не другое

Я делаю это, указав sql-запрос и тип конфигурации. Код, который фактически делает обработку запросов выглядит следующим образом:

List<Object> result = null; 
try { result = dc.ExecuteQuery(elementType, entry.Command).OfType<Object>().ToList(); } 
catch (Exception ex) { HandleException(ex, WebCacheAgentLogEvent.DatabaseExecutionError); continue; } 

elementType является System.Type создается из типа, указанный в конфигурации (с использованием Type.GetType()) и entry.Command является запросом SQL.

Конкретный тип объекта У меня проблема с выглядит следующим образом:

public class FooCount 
{ 
    [Column(Name = "foo_id")] 
    public Int32 FooId { get; set; } 

    [Column(Name = "count")] 
    public Int32 Count { get; set; } 
} 

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

select foo_id as foo_id, sum(count) as [count] 
from foo_aggregates 
group by foo_id 
order by foo_id 

По какой-то причине, когда запрос выполняется, свойство «Count» заполняется, но не свойство «FooId». Я попытался выполнить запрос сам, и вернутся имена столбцов, а имена столбцов совпадают с тем, что я указал в моих атрибутах сопоставления. Помогите!

+0

@BFree - редактирование вопроса просто для изменения чужого стиля кодирования - просто грубо ИМХО. Пожалуйста, не надо. –

+0

Мой плохой. Я не думал, что ты на самом деле хотел это сделать, я думал, что это был несчастный случай. – BFree

+0

@ Daniel - код отправки, который заставляет людей прокручивать право читать, это отличный способ заставить их игнорировать ваш вопрос. Сдерживание людей, пытающихся помочь, еще лучше ... –

ответ

5

Это безумие ...

Что фиксированная моя проблема была украшающие мой класс сущностей с TableAttribute:

[Table(Name = "foo_aggregates")] 
public class FooCount 
{ 
    [Column(Name = "foo_id")] 
    public Int32 FooId { get; set; } 

    [Column(Name = "count")] 
    public Int32 Count { get; set; } 
} 

Я предположил, что (ошибочно, по-видимому), что, так как я не использовал GetTable<T>() метод, мне не нужен соответствующий атрибут сопоставления.

Обновление: года спустя полтора, она, наконец, меня осенила, похоже, украшения ColumnAttribute на свойствах игнорируются, если нет соответствующего украшения TableAttribute на классе. Это объясняет, почему свойство Count было заполнено, так как его именование будет соответствовать столбцу в выражении SQL, тогда как FooId/foo_id, конечно, не совпадают.

+0

Я был свидетелем этого исправления через SharedView, и я сбитый с толку также. – NilObject

+1

Вам даже не нужно имя, если вы делаете это так. Вы можете просто сказать [Таблица]. – BFree

+0

Просто заметил, что он также работает для более сложных запросов. Я просто сделал рекурсивный запрос, а затем выбрал его, и он работает. –

2

Linq To Sql имеет сложное отображение времени, когда имена свойств отличаются от имен столбцов. Попробуйте изменить имя своей собственности на foo_id с помощью подчеркивания. Это должно к трюку.

Либо это, либо вы можете изменить оператор select на foo_id как FooId, чтобы соответствовать вашей собственности. В любом случае, они должны быть одинаковыми (не обязательно должны быть в одном и том же случае).

+0

У меня никогда не было проблемы с сопоставлением, пока я указываю правильное имя столбца в атрибуте сопоставления ... хотя это имело бы такое же значение, как и проблема на самом деле, ha (см. Мой ответ) –

+0

Обычно, когда вы перетаскиваете таблицы/хранимые процедуры на Linq на Sql desinger, он делает все это для вас, поэтому вы не обращаете внимания на атрибуты таблицы.Вы больше сосредотачиваетесь на материалах столбца. Узнайте, что-то новое каждый день ... – BFree

+0

Я прекратил использовать конструктор, когда я начал получать случайные ошибки сборки, используя его. Мне так же легко написать свойства, как я сделал выше, и это легче управлять в проекте (IMHO), чистым кодом и т. Д. –