Здравствуйте, snaphold, Вы писали:
S>Можно ли сделать один метод для 2 случаев, чтобы не открывать 2 контекста?
S>т.е. хотелось бы иметь что-то типа конструктора метода или делегата и чтобы к нему можно было добавлять всякие Count
А чем не подходит
static IEnumerable<SomeClass> SomeCondition(this IEnumerable<SomeClass> source) { /* reusable code */}
// ...
var c = someData.SomeCondition().OrderBy(...)
?
(с IQueryable, понятное дело, тоже работает).
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, snaphold, Вы писали:
S>>Можно ли сделать один метод для 2 случаев, чтобы не открывать 2 контекста?
S>>т.е. хотелось бы иметь что-то типа конструктора метода или делегата и чтобы к нему можно было добавлять всякие Count
S>А чем не подходит
S>S>static IEnumerable<SomeClass> SomeCondition(this IEnumerable<SomeClass> source) { /* reusable code */}
S>// ...
S>var c = someData.SomeCondition().OrderBy(...)
S>
?
S>(с IQueryable, понятное дело, тоже работает).
забыл про расширетили, но они тут не особо помогут ибо идет left join на другую таблицу
т.е. есть таблица Data в которой есть столбец City и есть таблица CityPhones.
надо вывести кол-во и собственно потом сами города у которых нет соотвествия в таблице CityPhones
using (var ctx = new Context())
{
var CityPhonesCount = ctx.Data.Select(a => a.City)
.GroupJoin(ctx.CityPhones.Select(c => c.Name),
d => d,
e => e,
(d, i) => new { d, i = i.DefaultIfEmpty() })
.SelectMany(z => z.i.Select(e => new { d = z.d, e }))
.Where(n => n.e == null)
.Select(n => n.d)
.Distinct()
.Count();
}
Здравствуйте, snaphold, Вы писали:
S>т.е. хотелось бы иметь что-то типа конструктора метода или делегата и чтобы к нему можно было добавлять всякие Count
Т.е. изобрести свой linq хотите (просто уровень абстракции будет другой)? В принципе ничего не мешает это сделать (метод который вернет IQueryable<T> к которому надо будет еще добавить ToArray(Async)/Count(Async) и т.д.
Но я бы пошел наверное по другому пути — класс Query, что-то вроде (грубый код).
public class MyDataQuery {
public async Task<int> CountAsync()
{
using (var context = new MyDbContext())
return await this.GetBaseQuery(context).CountAsync();
}
public async Task<IEnumerable<MyData>> ExecuteAsync()
{
using (var context = new MyDbContext())
return await this.GetBaseQuery(context).ToArrayAsync();
}
private IQueryable<MyData> GetBaseQuery(DbContext context) {
// общая часть запроса
return context.MyDataTable.Where(... );
}
}
Все это еще можно и в базовый QueryBase<T> класс завернуть (чтобы каждый раз не писать методы CountAsync и ExecuteAsync).
Здравствуйте, Doc, Вы писали:
Doc>Здравствуйте, snaphold, Вы писали:
S>>т.е. хотелось бы иметь что-то типа конструктора метода или делегата и чтобы к нему можно было добавлять всякие Count
Doc>Т.е. изобрести свой linq хотите (просто уровень абстракции будет другой)? В принципе ничего не мешает это сделать (метод который вернет IQueryable<T> к которому надо будет еще добавить ToArray(Async)/Count(Async) и т.д.
Doc>Но я бы пошел наверное по другому пути — класс Query, что-то вроде (грубый код).
Doc>public class MyDataQuery {
Doc> public async Task<int> CountAsync()
Doc> {
Doc> using (var context = new MyDbContext())
Doc> return await this.GetBaseQuery(context).CountAsync();
Doc> }
Doc> public async Task<IEnumerable<MyData>> ExecuteAsync()
Doc> {
Doc> using (var context = new MyDbContext())
Doc> return await this.GetBaseQuery(context).ToArrayAsync();
Doc> }
Doc> private IQueryable<MyData> GetBaseQuery(DbContext context) {
Doc> // общая часть запроса
Doc> return context.MyDataTable.Where(... );
Doc> }
Doc>}
Doc>Все это еще можно и в базовый QueryBase<T> класс завернуть (чтобы каждый раз не писать методы CountAsync и ExecuteAsync).
а в 4.0 можно что-то подобное замутить? или надо аналог await писать?