powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Получить ObjectSet по идентификатору
9 сообщений из 9, страница 1 из 1
Получить ObjectSet по идентификатору
    #38138399
StaffaKT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможен ли сабж?

Например что-то вроде этого:

Код: c#
1.
2.
3.
4.
5.
6.
using (MyModel conteiner = new MyModel())
{
     Users elem = (from u in conteiner["Users"]
                   where u.ID == _id
                   select u).FirstOrDefault();
}



Пните в нужную сторону, плз!
...
Рейтинг: 0 / 0
Получить ObjectSet по идентификатору
    #38138619
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaffaKT,

Код: c#
1.
ctx.Set<T>

?
...
Рейтинг: 0 / 0
Получить ObjectSet по идентификатору
    #38138667
StaffaKT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
netivan,
Хотелось бы, что бы идентификатор набора был задан строкой =)


Суть в том, что у меня есть куча методов, которые возвращают элемент набора по указанному ID, не хотелось бы городить 100 методов вместо одного, куда бы передавался идентификатор набора, который требуется получить.
...
Рейтинг: 0 / 0
Получить ObjectSet по идентификатору
    #38138682
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем заменять родной для языка идентификатор (имя метода) каким-то своим? При этом жертвуя строгой типизацией.
...
Рейтинг: 0 / 0
Получить ObjectSet по идентификатору
    #38138759
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaffaKT,

"репозиторий" вам в помощь. Реализуете один раз и все.
ЗЫ правда у себя метод поиска по ID я сделал абстрактный, т.к. как в случае составного ключа искать хз
...
Рейтинг: 0 / 0
Получить ObjectSet по идентификатору
    #38140783
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaffaKTСуть в том, что у меня есть куча методов, которые возвращают элемент набора по указанному ID, не хотелось бы городить 100 методов вместо одного, куда бы передавался идентификатор набора, который требуется получить.

netivanЗЫ правда у себя метод поиска по ID я сделал абстрактный, т.к. как в случае составного ключа искать хз


Привет!

Теперь у вас будет один метод на любой случай.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
            using (var ctx = new DB1Entities())
            {
                var objt1 = ctx.GetById<T1>(new { ID = 1 });
                var objt2 = ctx.GetById<T2>(new { ID1 = "HDS QQ 1", ID2 = "VSQ 5 GF" });

                var res3 = ctx.TryGetById<T1>(new { ID = 1 }, out objt1);
                var res4 = ctx.TryGetById<T2>(new { ID1 = "HDS QQ 1", ID2 = "VSQ 5 GF" }, out objt2);
            }



реализация Estension метода GetById
Код: 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.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Metadata.Edm;
using System.Data.Objects;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var ctx = new DB1Entities())
            {
                var objt1 = ctx.GetById<T1>(new { ID = 1 });
                var objt2 = ctx.GetById<T2>(new { ID1 = "HDS QQ 1", ID2 = "VSQ 5 GF" });

                var res3 = ctx.TryGetById<T1>(new { ID = 1 }, out objt1);
                var res4 = ctx.TryGetById<T2>(new { ID1 = "HDS QQ 1", ID2 = "VSQ 5 GF" }, out objt2);
            }
        }
    }

    public static class EfHelper
    {
        public static T GetById<T>(this DbContext ctx, object idValue)
        {
            var objCtx = ((IObjectContextAdapter)ctx).ObjectContext;

            var entityKey = CreateEntityKey<T>(objCtx, idValue);

            return (T)objCtx.GetObjectByKey(entityKey);
        }

        public static bool TryGetById<T>(this DbContext ctx, object idValue, out T entity)
        {
            var objCtx = ((IObjectContextAdapter)ctx).ObjectContext;

            var entityKey = CreateEntityKey<T>(objCtx, idValue);

            object tempObj;
            var res = objCtx.TryGetObjectByKey(entityKey, out tempObj);

            entity = (T)tempObj;

            return res;
        }
        
        private static EntityKey CreateEntityKey<T>(ObjectContext ctx, object idValue)
        {
            var entityContainer = ctx.MetadataWorkspace.GetEntityContainer(
                ctx.DefaultContainerName, DataSpace.CSpace);

            var osType = ctx.MetadataWorkspace.GetItem<EntityType>(
                typeof(T).FullName, DataSpace.OSpace);

            var csType = (EntityType)ctx.MetadataWorkspace.GetEdmSpaceType(osType);

            while (csType.BaseType != null)
                csType = (EntityType)csType.BaseType;

            var entitySet = entityContainer.GetEntitySetByName(csType.Name, true);

            var idValueType = idValue.GetType();
            var keyValues = new List<KeyValuePair<string, object>>();
            foreach (var key in csType.KeyMembers)
            {
                var value = idValueType.GetProperty(key.Name).GetValue(idValue);

                keyValues.Add(new KeyValuePair<string, object>(key.Name, value));
            }

            var fullEsName = string.Format("{0}.{1}", entityContainer.Name, entitySet.Name);

            return new EntityKey(fullEsName, keyValues);
        }
    }
}


...
Рейтинг: 0 / 0
Получить ObjectSet по идентификатору
    #38141452
StaffaKT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lord British,

Спасибо! Сейчас опробую =)
...
Рейтинг: 0 / 0
Получить ObjectSet по идентификатору
    #38141598
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord British,

спасибо за расширение:)
...
Рейтинг: 0 / 0
Получить ObjectSet по идентификатору
    #38142073
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не за что.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Получить ObjectSet по идентификатору
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]