我如何编写一个名为“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中呈现..
答案 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);