|
Entity Framework (EF) Как осуществить поиск по таблице по слож. ключу (2 поля) ч-з OneOf?
|
|||
---|---|---|---|
#18+
EF довольно старый, до версии 4.5 (он при константе x==null и запросе ".Where(e=>e.field == x)" генерирует вместо IS NULL сравнение с null). Но этот баг - не есть вопрос, по поводу которого был создан данный топик. Как сделать поиск в таблице по коллекции пар значений? Через значения одного поля вроде можно Код: c# 1. 2. 3.
А если ключ составной (2 int-поля)? Id, RevisionId - загнанные в свою структуру. Contains выдает ошибку (как в случае типа у table = List<своя_структура>, так и table = список.Select(x=>new {Id=x.Id, Revision=x.RevisionId}).ToList()). То есть список, к которому применяется Contains, не может быть ни списком моих структур, ни списком анонимных объектов. Хотя в некоторых других местах EF анонимные объекты работают. А у меня есть в памяти таблица составных ключей (по 2 int в каждом), соответствие которой надо найти в таблице БД. Моя таблица 1 100 2 200 3 300 Таблица в БД name1 1 100 89a name2 1 150 90b name3 2 150 0Af name4 2 200 09j name5 3 400 0Bf из нее надо выбрать, значит, строки name1 1 100 89a name4 2 200 09j так как первая содержит ключ (1,100), а вторая (2,200). Какой запрос написать? Последняя версия моего кода Код: c# 1. 2. 3. 4. 5. 6. 7.
Unable to create a constant value of type 'Anonymous type'. Only primitive types ('such as Int32, String, and Guid') are supported in this context. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 11:59 |
|
Entity Framework (EF) Как осуществить поиск по таблице по слож. ключу (2 поля) ч-з OneOf?
|
|||
---|---|---|---|
#18+
Так как Вы решаете данную проблему? Кстати, баг - в коде "int[]" буква "t" голубая, а не синяя ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2012, 11:08 |
|
Entity Framework (EF) Как осуществить поиск по таблице по слож. ключу (2 поля) ч-з OneOf?
|
|||
---|---|---|---|
#18+
Как-то сделал с помощью преобразования двух INT в новое поле, впрочем, (long) можно было бы и не писать в Select и Contains, результат был бы тот же, Код: c# 1. 2. 3. 4. 5.
Имеем проблему Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Почему не Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2012, 12:02 |
|
Entity Framework (EF) Как осуществить поиск по таблице по слож. ключу (2 поля) ч-з OneOf?
|
|||
---|---|---|---|
#18+
Кто-нибудь поможет? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2012, 16:54 |
|
Entity Framework (EF) Как осуществить поиск по таблице по слож. ключу (2 поля) ч-з OneOf?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2012, 18:50 |
|
Entity Framework (EF) Как осуществить поиск по таблице по слож. ключу (2 поля) ч-з OneOf?
|
|||
---|---|---|---|
#18+
buser, Спасибо, но в примере, как я понял, решается проблема, когда принимается только 1 аргумент (ключ), а чтобы передать туда составной ключ, предлагают сделать анонимный объект. У меня так уже сделано. А проблема есть. То есть, возможно ли как-то переписать код, чтобы в запросе было in()? Я вроде находил какие-то пользовательские переопределения генерации запросов EF, которые могли это делать... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2012, 11:08 |
|
Entity Framework (EF) Как осуществить поиск по таблице по слож. ключу (2 поля) ч-з OneOf?
|
|||
---|---|---|---|
#18+
Поливанов Алексей, я наверное не понял Вас... IN по двум полям? Чем вам Join или Intecept не подходит? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2012, 13:24 |
|
Entity Framework (EF) Как осуществить поиск по таблице по слож. ключу (2 поля) ч-з OneOf?
|
|||
---|---|---|---|
#18+
buser, Ладно, попробую свой Contains заменить на Intersect. Может, поможет. Проблема в том, что NHibernate Entity Framework генерирует неоптимальные запросы. Вместо Код: sql 1.
он пишет колоссальное Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2012, 15:55 |
|
Entity Framework (EF) Как осуществить поиск по таблице по слож. ключу (2 поля) ч-з OneOf?
|
|||
---|---|---|---|
#18+
Если вы писали запросы, то наверное понимаете, что хрен редьки не слаще, т.е. оба запроса неоптимальны... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2012, 16:24 |
|
Entity Framework (EF) Как осуществить поиск по таблице по слож. ключу (2 поля) ч-з OneOf?
|
|||
---|---|---|---|
#18+
По поводу Intersect, это из той же оперы , что и Join, нам сейчас C# на такой код выдает ошибку: Код: sql 1.
Unable to create a constant value of type "Anonymous type". Only primitive types ('such as Int32, String, and Guid') are supported in this context. Есть подозрение, что при Intersect будет то же самое. По поводу неоптимальности - до этого было N запросов на каждую пару (а их сейчас полсотни)! вместо одного. ИМХО, лучше один неоптимальный... Сейчас пытаемся слить не int+int->long, а int->string. То есть преобразовать int в строку средствами EF. Но EF не понимает в лямбдах string.Format("{0},{1}",...,...) и .ToString(). Может, (string)id поможет. Можно ли как-то не через преобразование int в long, а через преобразование int в string заменить два поля одним? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2012, 10:53 |
|
Entity Framework (EF) Как осуществить поиск по таблице по слож. ключу (2 поля) ч-з OneOf?
|
|||
---|---|---|---|
#18+
Вот, нашел Надо использовать SqlFunctions.StringConvert http://stackoverflow.com/questions/4502842/int-to-string-in-entity-framework Однако Код: sql 1. 2. 3. 4. 5.
An error occurred while executing the command definition. See the inner exception for details. Some part of your SQL statement is nested too deeply. Rewrite the query or break it up into smaller queries. Поищу, нет ли там чего-то вроде SQLFunctions.MergeStrings() вместо + ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2012, 11:06 |
|
Entity Framework (EF) Как осуществить поиск по таблице по слож. ключу (2 поля) ч-з OneOf?
|
|||
---|---|---|---|
#18+
Вобщем я набрехал... Но, все равно, оставьте вы свою идею... компактный запрос не значит оптимальный... вы либо структуру таблицы переделайте... либо одно из двух - вью, хранимая процедура... вашим индексам п-ц... такой запрос - скан таблицы... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
Dynamically Composing Expression Predicates Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2012, 13:09 |
|
Entity Framework (EF) Как осуществить поиск по таблице по слож. ключу (2 поля) ч-з OneOf?
|
|||
---|---|---|---|
#18+
buser, Спасибо за помощь. Может быть, попробуем сделать импортируемую хранимку или View. Только хранимка вряд ли примет от EF целый массив значений, а View - должно иметь 1 поле (string либо long) вместо 2-х int, так? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2012, 11:15 |
|
Entity Framework (EF) Как осуществить поиск по таблице по слож. ключу (2 поля) ч-з OneOf?
|
|||
---|---|---|---|
#18+
Ага - так... А в процу можно передать набор идишников или ексемль (см. Массивы и списки в SQL), да в Linq2Sql и EF можно директом слать запросы и транслировать результаты в набор сущностей... ну типа на самый край :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2012, 12:27 |
|
|
start [/forum/topic.php?fid=17&msg=37885710&tid=1350289]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
157ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 305ms |
total: | 571ms |
0 / 0 |