简单的LINQ to SQL扩展方法

时间:2011-01-18 00:59:24

标签: linq-to-sql extension-methods criteria

我如何编写一个名为“IsActive”的简单LINQ to SQL扩展方法,该方法将包含几个不同字段的一些基本标准检查,这样我就可以在所有地方重用这个“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;
}

否则,我将不得不在整个系统中复制相同的旧标准,在100万个不同的查询中。

注意:方法必须在SQL中呈现..

4 个答案:

答案 0 :(得分:4)

很好的问题,显然需要能够定义可重用的过滤表达式,以避免在不同的查询中冗余地指定逻辑。

此方法将生成一个可以传递给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();

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以使用部分类来实现此目的。

在新文件中放置以下内容:

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对象(lambda中的x)只是一个对象,而Linq to SQL将生成的类定义为partial,因此可以使用partial类向生成的类添加功能(属性,方法等)。

我不相信上面的内容会被渲染到SQL查询中。如果你想在SQL查询中执行所有逻辑,我建议创建一个调用where方法的方法,并在必要时调用它。

修改

示例:

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()

即可

答案 3 :(得分:0)

这里的派对来晚了,但我使用的另一种方法是:

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

然后

var activeListings = GetActiveListings(ctx.Listings);