2016-09-20 8 views
2

Это моя база данных ПОКО:Строительство SqlExpression бросает InvalidOperationException, когда не используется анонимный типа в Select() пункт

public class MyPoco1 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Я хочу, чтобы выбрать и результаты карты в пользовательские POCO с другим именем свойства:

public class MyPocoAlias1 
{ 
    public string OtherName { get; set; } 
} 

public class MyService : ServiceStack.Service 
{ 
    public List<MyPocoAlias1> Any(MyRequest request) 
    { 
     // throws InvalidOperationException 
     var q1 = Db.From<MyPoco1>().Select(c => new MyPocoAlias1 { OtherName = c.Name }); 

     // this works 
     var q2 = Db.From<MyPoco1>().Select(c => new { OtherName = c.Name }); 
     var items = Db.Select<MyPocoAlias1>(q2); 

     return items; 
    } 
} 

q1 терпит неудачу с System.InvalidOperationException:

«переменная 'с' типа эталонным 'MyPoco1' d из области действия '', но это не определено ".

q2 работает, но есть ли способ сделать это с помощью сильного типа (который проверяет правильные имена/типы свойств) или это обязательно для использования анонимного типа в предложении .Select()?

ответ

3

Цель .Select() в типизированном выражении OrgLite SqlExpression - указать, какие поля должны быть указаны в выражении SELECT. Что вы можете использовать, чтобы выбрать одно поле, например:

var q = db.From<Table>().Select(x => x.Name); 

Несколько полей:

var q = db.From<Table>().Select(x => new { x.Id, x.Name }); 

или полей с псевдонимами:

var q = db.From<Table>().Select(x => new { x.Id, OtherName = x.Name }); 

Это не для определения, какая модель должна проецировать to, что происходит, когда вы выполняете запрос, например:

var results = db.Select<MyPocoAlias1>(q); 

Что будет отображать возвращаемый набор результатов (например, Идентификатор SELECT, имя AS "OtherName") в MyPocoAlias1 POCO.

1

в коде

вар q1 = Db.From() .Select (с => новый MyPocoAlias1 {OtherName = c.Name})

Это путь мы используем анонимных типов. удалите свой класс MyPocoAlias1, потому что он не нужен. Вы использовали анонимный тип, но вы его назвали. измените это на

var q1 = Db.From<MyPoco1>() 
    .Select(c => new { OtherName = c.Name }) 

И вместо OtherName вы можете использовать все, что хотите.

+0

Как q2 в моем примере? Значит, нельзя использовать класс в Select()? –

+0

вы можете использовать анонимный класс, который выполняет эту работу, намного проще. и позволяет вам называть его, что вы хотите. но можно использовать класс. вы должны использовать lambda expresion. вы знаете о них? – Media

+0

Я не могу назвать его, что хочу, потому что я должен отобразить результат в «MyPocoAlias1». Я немного разбираюсь в лямбда-выражениях, но не могу понять, что не так в моем коде (и я не понимаю детали исключения), не то, что 'c => new MyPocoAlias1 {OtherName = c.Name}' a действительная лямбда? –

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

  • Нет связанных вопросов^_^