Простой метод расширения LINQ to SQL - PullRequest
2 голосов
/ 18 января 2011

Как бы я написал простой метод расширения LINQ to SQL под названием «IsActive», который содержал бы несколько базовых проверок критериев нескольких различных полей, чтобы я мог повторно использовать эту логику «IsActive» повсеместно, не дублируя логику .

Например, я бы хотел сделать что-то вроде этого:

return db.Listings.Where(x => x.IsActive())

И IsActive будет что-то вроде:

public bool IsActive(Listing SomeListing)
{
    if(SomeListing.Approved==true && SomeListing.Deleted==false)
        return true;
    else
        return false;
}

В противном случае мне придется дублировать те же самые старые критерии в миллионе различных запросов по всей моей системе.

Примечание: метод должен отображаться в SQL ..

Ответы [ 4 ]

4 голосов
/ 21 января 2011

Хороший вопрос, существует явная необходимость иметь возможность определить повторно используемое фильтрующее выражение, чтобы избежать избыточного указания логики в разнородных запросах.

Этот метод создаст фильтр, который вы можете передать методу Where.

public Expression<Func<Listing, bool>> GetActiveFilter()
{
  return someListing => someListing.Approved && !someListing.Deleted;
}

Затем, позже, позвоните по этому номеру:

Expression<Func<Filter, bool>> filter = GetActiveFilter()
return db.Listings.Where(filter);

Поскольку используется Expression<Func<T, bool>>, не будет проблем с переводом на sql.


Вот еще один способ сделать это:

public static IQueryable<Filter> FilterToActive(this IQueryable<Filter> source)
{
  var filter = GetActiveFilter()
  return source.Where(filter);
}

Потом, позже,

return db.Listings.FilterToActive();
0 голосов
/ 30 сентября 2015

Поздно здесь, на вечеринке, но я использую еще один способ:

public static IQueryable<Listing> GetActiveListings(IQueryable<Listing> listings)
{
    return listings.Where(x => x.Approved && !x.Deleted);
}

, а затем

var activeListings = GetActiveListings(ctx.Listings);
0 голосов
/ 18 января 2011

Для этого можно использовать частичный класс.

В новом файле поместите следующее:

namespace Namespace.Of.Your.Linq.Classes 
{
    public partial class Listing 
    {
        public bool IsActive()
        {
            if(this.Approved==true && this.Deleted==false)
                return true;
            else
                return false;
        }
    }
}

Поскольку объект Listing (x в вашей лямбде) является просто объектом, а Linq to SQL определяет сгенерированные классы как частичные, вы можете добавить функциональность (свойства, методы и т. Д.) В сгенерированные классы, используя частичные классы. *

Я не верю, что вышеизложенное будет отображено в запросе SQL. Если вы хотите выполнить всю логику в запросе SQL, я бы порекомендовал создать метод, который вызывает метод where, и просто вызывать его при необходимости.

EDIT

Пример:

public static class DataManager
{
    public static IEnumerable<Listing> GetActiveListings()
    {
        using (MyLinqToSqlDataContext ctx = new MyLinqToSqlDataContext())
        {
            return ctx.Listings.Where(x => x.Approved && !x.Deleted);
        }
    }
}

Теперь, когда вы хотите получить все активные списки, просто позвоните DataManager.GetActiveListings()

0 голосов
/ 18 января 2011
public static class ExtensionMethods
{
  public static bool IsActive( this Listing SomeListing)
  {
    if(SomeListing.Approved==true && SomeListing.Deleted==false)
        return true;
    else
        return false;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...