LINQ-to-SQL: ExecuteQuery (Type, String) заполняет одно поле, но не другое - PullRequest
5 голосов
/ 26 февраля 2009

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

Я делаю это, указывая 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. Я попытался выполнить запрос сам, и верные имена столбцов возвращаются, и имена столбцов совпадают с тем, что я указал в моих атрибутах отображения. Помогите!

Ответы [ 2 ]

5 голосов
/ 26 февраля 2009

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

То, что исправило мою проблему, было украшением моего класса сущности с 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, конечно, не совпадают.

2 голосов
/ 26 февраля 2009

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

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

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