Как эмулировать случай-когда для linq? - PullRequest
0 голосов
/ 15 мая 2019
IQueryable a;
IQueryable b;

IQueryable res = from ab in a.Union(b)
select {
    prop = ab.prop,
    deletable = ab.type == CONSTANT_TYPE && 
    (from d in deletableTable 
     where key = CONSTANT_KEY
     select d).FirstOrDefault().RenderCode == CONSTANT_RENDER_CODE
};
return res;

Приведенный выше код вызывает ошибку

b появляется в двух структурно несовместимых инициализациях в рамках одного запроса LINQ to Entities.Тип может быть инициализирован в двух местах одного и того же запроса, но только если в обоих местах установлены одинаковые свойства и эти свойства установлены в одном и том же порядке.

Я не уверен, в чем причина, но я предполагаю, что, поскольку я возвращаю IQueryable, он не может построить строку SQL из-за d in deletableTable ? true : false.

В SQL это выглядит как

SELECT 
case
    when (SELECT TOP 1 code FROM deletable) = CONSTANT then true
    else false
end

Есть ли какое-то решение дляlinq, если я хочу вернуть IQueryable?

1 Ответ

0 голосов
/ 16 мая 2019

Сообщение об ошибке в вопросе было вызвано тем, что в запрашиваемом a и в запрашиваемом b отсутствовало удаляемое значение.

IQueryable a = getA();
IQueryable b = getB();

IQueryable res = from ab in a.Union(b)
select {
    prop = ab.prop,
    deletable = ab.type == CONSTANT_TYPE && 
    (from d in deletableTable 
     where key = CONSTANT_KEY
     select d).FirstOrDefault().RenderCode == CONSTANT_RENDER_CODE
};
return res;

getA и getB первоначально вернули объекты со свойством prop.

Если вы хотите сделать from ab in a.Union(b) select deletable = 12, даже если 12 это константа из вашего кода, поле deletable должно быть объявлено в querybable a и в queryable b, иначе вы получите ошибку из вопроса.

Я добавил объявление deletable, чтобы исправить ошибку:

getA() {
    from a ...
    select new {
        prop,
        deletable = false //add field, to use union
    }
}

getB() {
    from b ...
    select new {
        prop,
        deletable = false //add field, to use union
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...