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

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

Код: 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
05.02.2013, 18:08
    #38138619
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить ObjectSet по идентификатору
StaffaKT,

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

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


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

"репозиторий" вам в помощь. Реализуете один раз и все.
ЗЫ правда у себя метод поиска по ID я сделал абстрактный, т.к. как в случае составного ключа искать хз
...
Рейтинг: 0 / 0
06.02.2013, 20:52
    #38140783
Lord British
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить ObjectSet по идентификатору
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
07.02.2013, 12:18
    #38141452
StaffaKT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить ObjectSet по идентификатору
Lord British,

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

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


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